Lightcord/BetterDiscordApp/js/main.js

11497 lines
1.4 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; });
// var settingsPanel, voiceMode, pluginModule, themeModule, dMode, publicServersModule, mainCore, BDV2;
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.4";
const bbdChangelog = {
description: "Lightcord Edition.",
changes: [{
title: "What's New?",
items: ["**Lightcord** is now using BandagedBD. That means all plugins you were using can be used too !", "**Window Transparency** changes were made to more compatible with external window managers and addons like Glasscord.", "Initialization sequence has once again been changed slightly to hopefully improve loading times.", "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."]
}, {
title: "Bug Fixes",
type: "fixed",
items: ["Some fixes related to showing modals in the `BdApi`."]
}]
};
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"
},
"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"
},
/* 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).",
implemented: false,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Blur Personnal Informations": {
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 Internal Developer Options. This allow the \"Experiments\" tab and the \"Developer Options\" tab. (must close and reopen settings)",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Ad Block": {
id: "lightcord-4",
info: "Block any BOT that dm you with an invite link. Even in an embed.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Enable Lightcord Servers": {
id: "lightcord-5",
info: "Disabling it erase any informations about you in our servers. But you won't see anything like custom badges.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
/** Lightcord Window */
"Always-on-Top": {
id: "lightcord-3",
info: "Enable window's Always-on-Top mode, where Lightcord stays on top of other applications.",
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-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
};
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) => {
// value = typeof(value) !== "object" ? value : new Proxy(value, {
// get: function(obj, mod) {
// if (!obj.hasOwnProperty(mod)) return undefined;
// return obj[mod];
// },
// set: function(obj, mod) {
// if (obj.hasOwnProperty(mod)) return Utils.err("Deprecated Global", "Trying to overwrite deprecated BD globals");
// }
// });
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"]);
class CoreWrapper {
constructor(bdConfig) {
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
}
init() {
// deprecateGlobal("mainCore", this.mainCore);
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
}
} // function patchModuleLoad() {
// const namespace = "betterdiscord";
// const prefix = `${namespace}/`;
// const Module = require("module");
// const load = Module._load;
// // const resolveFilename = Module._resolveFilename;
// Module._load = function(request) {
// if (request === namespace || request.startsWith(prefix)) {
// const requested = request.substr(prefix.length);
// if (requested == "api") return BdApi;
// }
// return load.apply(this, arguments);
// };
// // Module._resolveFilename = function (request, parent, isMain) {
// // if (request === "betterdiscord" || request.startsWith("betterdiscord/")) {
// // const contentPath = PluginManager.getPluginPathByModule(parent);
// // if (contentPath) return request;
// // }
// // return resolveFilename.apply(this, arguments);
// // };
// return function() {
// Module._load = load;
// };
// }
// patchModuleLoad();
// var settingsPanel, voiceMode,, dMode, publicServersModule;
// var bdConfig = null;
__webpack_require__(/*! request */ "request"); // just in cache so plugin can require it too
/***/ }),
/***/ "./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");
/* 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");
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);
/***/ }),
/***/ "./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 {
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 = [];
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)}`);
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.userSettingsAccount)[0].userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
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[0]}, ${selectors[1]}, ${selectors[2]} {
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
filter: blur(4px);
opacity: .8;
}
${selectors[0]}:hover, ${selectors[1]}:hover, ${selectors[2]}:hover {
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 {
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: 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 _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");
const __non_webpack_require__ = window.require;
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 = /^\\@/;
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
constructor() {
this.timeCache = {};
this.watchers = {};
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/")));
}
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.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;
try {
__non_webpack_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 = __non_webpack_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 __non_webpack_require__.cache[__non_webpack_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 {
__non_webpack_require__.cache[__non_webpack_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) {
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");
}
}());
/***/ }),
/***/ "./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__);
function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));
// this.init();
}
Core.prototype.setConfig = function (config) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
};
Core.prototype.init = async function () {
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;
}
const latestLocalVersion = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].updater ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].updater.LatestVersion : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].latestVersion;
if (latestLocalVersion > _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].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__WEBPACK_IMPORTED_MODULE_1__["default"].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 = __webpack_require__(/*! electron */ "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 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"]);
}
const emojiModule = _emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"];
_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")();
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.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.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 () {
await _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript("ace-script", "https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js");
if (window.require.original) window.require = window.require.original;
};
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();
}
}
}
};
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];
let [classNameLayer, classNameSocialLinks] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer, BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks];
if (node.classList.contains(classNameLayer)) {
if (node.getElementsByClassName("guild-settings-base-section").length) node.setAttribute("layer-id", "server-settings");
if (node.getElementsByClassName(classNameSocialLinks).length) {
node.setAttribute("layer-id", "user-settings");
node.setAttribute("id", "user-settings");
if (!document.getElementById("bd-settings-sidebar")) _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar();
}
}
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;
returnValue.props.className += " bd-guild";
if (guildData.unread) returnValue.props.className += " bd-unread";
if (guildData.selected) returnValue.props.className += " bd-selected";
if (guildData.audio) returnValue.props.className += " bd-audio";
if (guildData.video) returnValue.props.className += " bd-video";
if (guildData.badge) returnValue.props.className += " bd-badge";
if (guildData.animatable) returnValue.props.className += " bd-animatable";
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 => {
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("div", {
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;
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: "32px",
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());
/***/ }),
/***/ "./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";
/* harmony default export */ __webpack_exports__["default"] = (new class DataStore {
constructor() {
this.data = {
settings: {
stable: {},
canary: {},
ptb: {}
}
};
this.pluginData = {};
}
initialize() {
try {
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(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdstorage.json"));
}
get settingsFile() {
return this._settingsFile || (this._settingsFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].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 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 [classNameLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0].layer, BDModules.get(e => e.contextMenu)[0]];
function attach() {
let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + classItems.contextMenu.split(" ")[0]);
if (!cm) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount");
const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classNameLayer}">`);
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.contextMenu} bd-context-menu"></div>`);
cmWrap.append(cm);
container.append(cmWrap);
cmWrap.style.top = e.clientY + "px";
cmWrap.style.left = e.clientX + "px";
cmWrap.style.zIndex = "1002";
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 = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + classNameLayer.split(" ")[0]);
const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.itemGroup}">`);
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.clickable}">`);
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);
cm.style.display = "none";
});
cmg.append(cmi);
cm.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() + (el.className || "").split(" ").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/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__);
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: {}
};
}
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 => {
badgesToFetch.push([user, resolve]);
setImmediate(() => {
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();
console.log(responseBody);
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
console.error(err);
users.forEach(data => {
data[1]([]); // resolve no badge fetched
});
});
});
});
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) {
console.log(`Sending request on ${route} with method ${method} and body`, data);
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
} : {})
});
};
const Constants = {
SERVER_URL: "http://127.0.0.1",
badges: [{
name: "Lightcord User",
id: "01cfa7b0-7cdb-4b0e-8258-9c6a78235c93",
defaultUsers: [],
scopes: ["user"],
component: _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__["default"]
}, {
name: "Lightcord Bug Hunter",
id: "f04698f5-816b-41e3-bd01-92291193d7a5",
defaultUsers: [],
scopes: [],
component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"],
href: "https://github.com/lightcord/lightcord/wiki/badges/bug_hunter"
}]
};
const Routes = {
badges: `/users/badges`,
delete: `/delete`
};
/***/ }),
/***/ "./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;
}
}
/***/ }),
/***/ "./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 _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 _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
//import DiscordCrypt from "./DiscordCrypt";
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();
}
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_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
if (!this.cancelEmojiRender) {
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
before: data => {
const message = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
if (!message) return;
const content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
if (!content || !content.length) return; // content = DiscordCrypt.decryptContent(content)
/**
* @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());
}
}
});
}
}
disable() {
if (!this.cancelEmoteRender) return;
this.cancelEmoteRender();
this.cancelEmoteRender = null;
}
}());
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 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* 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");
const debug = true;
const cache = {};
const cache2 = {};
/*
const PinnedModule = BDModules.get(e => e.default && e.default.getPinnedMessages)[0].default
const ChannelModule = BDModules.get(e => e.default && e.default.getChannelId)[0].default
const fetchMessagesModule = BDModules.get(e => e.default && e.default.fetchMessages)[0].default
const fetchMessagesModule2 = BDModules.get(e => e.default && e.default.fetchMessages)[1].default
const getMessagesModule = BDModules.get(e => e.default && e.default.getMessages)[0].default*/
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
constructor() {}
patch(attachment, id) {
process.nextTick(() => {
processAttachment(attachment, id);
});
}
start() {
/*const dispatcher = window.Lightcord.DiscordModules.dispatcher
const constants = window.Lightcord.DiscordModules.constants
const originalFetchMessages = fetchMessagesModule.fetchMessages
fetchMessagesModule.fetchMessages = function(){
const returnValue = originalFetchMessages.apply(this, arguments)
if(returnValue instanceof Promise){
returnValue
.then(() => {
const ev = getMessagesModule.getMessages(ChannelModule.getChannelId())
process.nextTick(() => {
for(const message of ev._array){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
})
})
}
return returnValue
}
const originalFetchMessages2 = fetchMessagesModule2.fetchMessages
fetchMessagesModule2.fetchMessages = function(){
const returnValue = originalFetchMessages2.apply(this, arguments)
if(returnValue instanceof Promise){
returnValue
.then(() => {
const ev = getMessagesModule.getMessages(ChannelModule.getChannelId())
process.nextTick(() => {
for(const message of ev._array){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
})
})
}
return returnValue
}
const alreadyUsed = {}
const originalGetPinnedMessages = PinnedModule.getPinnedMessages.bind(PinnedModule)
PinnedModule.getPinnedMessages = function(){
const pinned = originalGetPinnedMessages(...arguments)
if(!pinned || alreadyUsed[pinned.id])return pinned
alreadyUsed[pinned.id] = true
setTimeout(() => {
delete alreadyUsed[pinned.id]
for(const message of pinned.messages){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
}, 50);
return pinned
}
dispatcher.subscribe(constants.ActionTypes.MESSAGE_CREATE, (ev) => {
const message = ev.message
if(message.channel_id !== ChannelModule.getChannelId())return
process.nextTick(() => {
const attachments = message.attachments || []
if(attachments.length === 0)return // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
})
})
const messages = getMessagesModule.getMessages(ChannelModule.getChannelId())
process.nextTick(() => {
for(const message of messages._array){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
})*/
}
}());
function checkViruses(hash, data, id) {
data = data.toString("utf8").split(/[^\w\d]+/g);
let isHarmful = false;
for (let keyword of data) {
for (let oof of ["token", "email", "phone", "MFA", "2fa", "process", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) {
if (keyword.toLowerCase().includes(oof.toLowerCase())) {
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, /\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // _0x8db7('0x0', 'x1]f')
];
for (let regex of regexps) {
if (isHarmful) break;
isHarmful = regex.test(no_comments) ? "obfuscation/hidden code" : false;
}
}
}
if (!isHarmful) return;
cache[hash] = {
suspect: true,
name: hashToUrl[hash].split("/").pop(),
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
harm: isHarmful
};
console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`);
renderToElements(id, cache[hash], cache[hash].name);
}
const hashToUrl = {};
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();
let nextHash = (hash, data) => {
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) return checkViruses(hash, data, id);
const result = await res.json();
cache[hash] = result;
renderToElements(id, result, attachment.filename);
}).catch(() => {});
} else {
const result = cache[hash];
renderToElements(id, result, attachment.filename);
}
};
if (cache2[attachment.url]) return nextHash(cache2[attachment.url]);
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;
nextHash(hashResult, data);
});
}).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];
console.log(result);
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: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: BDModules.get(e => e.svg)[0].svg,
"aria-hidden": "false",
width: "16px",
height: "16px",
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";
_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 certified by Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "16px",
height: "16px",
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: "16px",
height: "16px",
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"
}))))), div);
} else {
div.parentNode.style.borderColor = "#4087ed";
_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 + " was made by the developers of Lightcord.",
style: "brand"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "16px",
height: "16px",
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: "16px",
height: "16px",
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"
}))))), div);
}
}
/***/ }),
/***/ "./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 {
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
}
});
}
}
}
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 => 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);
}
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 [classNameScroller] = [BDModules.get(e => e.scroller && e.scrollbarWidth)[0].scroller];
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.wrapper.split(" ")[0];
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`.${wrapper} .${classNameScroller} >:first-child`);
_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/reactDevTools.js":
/*!**************************************!*\
!*** ./src/modules/reactDevTools.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");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
const electron = __webpack_require__(/*! electron */ "electron");
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const BrowserWindow = electron.remote.BrowserWindow;
const webContents = electron.remote.getCurrentWebContents();
/* harmony default export */ __webpack_exports__["default"] = (new class reactDevTools {
constructor() {
let extensionPath = "";
if (process.platform === "win32") extensionPath = path.resolve(process.env.LOCALAPPDATA, "Google/Chrome/User Data");else if (process.platform === "linux") extensionPath = path.resolve(process.env.HOME, ".config/google-chrome");else if (process.platform === "darwin") extensionPath = path.resolve(process.env.HOME, "Library/Application Support/Google/Chrome");else extensionPath = path.resolve(process.env.HOME, ".config/chromium");
extensionPath += "/Default/Extensions/fmkadmapgofadopljbjfkapdkoienihi/";
if (fs.existsSync(extensionPath)) {
const versions = fs.readdirSync(extensionPath);
extensionPath = path.resolve(extensionPath, versions[versions.length - 1]);
}
this.extensionPath = extensionPath;
this.isExtensionInstalled = fs.existsSync(extensionPath);
this.listener = this.listener.bind(this);
_0globals__WEBPACK_IMPORTED_MODULE_1__["settings"]["React DevTools"].hidden = !this.isExtensionInstalled;
}
listener() {
if (!this.isExtensionInstalled) return;
BrowserWindow.removeDevToolsExtension("React Developer Tools");
const didInstall = BrowserWindow.addDevToolsExtension(this.extensionPath);
if (didInstall) _utils__WEBPACK_IMPORTED_MODULE_0__["default"].log("React DevTools", "Successfully installed react devtools.");else _utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("React DevTools", "Couldn't find react devtools in chrome extensions!");
}
start() {
setImmediate(() => webContents.on("devtools-opened", this.listener));
if (webContents.isDevToolsOpened()) this.listener();
}
stop() {
webContents.removeListener("devtools-opened", this.listener);
}
}());
/***/ }),
/***/ "./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 _bdEvents__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
/* harmony import */ var _reactDevTools__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./reactDevTools */ "./src/modules/reactDevTools.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
/* harmony import */ var _ui_tools__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/tools */ "./src/ui/tools.js");
/* harmony import */ var _ui_scroller__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/scroller */ "./src/ui/scroller.js");
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
/* harmony import */ var _ui_settingsPanel__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/settingsPanel */ "./src/ui/settingsPanel.js");
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_24__);
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel {
constructor() {
this.sideBarOnClick = this.sideBarOnClick.bind(this);
this.onChange = this.onChange.bind(this);
this.updateSettings = this.updateSettings.bind(this);
this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"](this.sideBarOnClick); // this.buildPluginProps = this.buildPluginProps.bind(this);
// this.buildThemeProps = this.buildThemeProps.bind(this);
this.showOriginal = this.showOriginal.bind(this);
}
get root() {
const _root = _domtools__WEBPACK_IMPORTED_MODULE_10__["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_10__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
if (!sidebar) return false;
const root = _domtools__WEBPACK_IMPORTED_MODULE_10__["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;
}, []);
}
sideBarOnClick(id) {
const contentRegion = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query(".contentRegion-3nDuYy, .content-region");
contentRegion.style.display = "none";
this.root.style.display = "";
switch (id) {
case "core":
this.renderCoreSettings();
break;
case "customcss":
this.renderCustomCssEditor();
break;
case "plugins":
case "themes":
this.renderAddonPane(id);
break;
case "lightcord":
this.renderLightcordSettings();
break;
case "status":
this.renderPresenceSettings();
break;
case "accountinfo":
this.renderAccountInfos();
break;
}
}
onClick() {}
onChange(id, checked) {
this.updateSettings(id, checked);
}
updateSettings(id, enabled) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
if (id == "bda-gs-2") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal");
}
if (id == "bda-gs-3") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal-chan");
}
if (id == "bda-gs-1") {
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].removeButton();
}
if (id == "bda-gs-4") {
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].stop();
}
if (id == "bda-gs-5") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
}
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
if (id == "bda-gs-7") {
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].removeColoredText();
}
if (id == "fork-ps-4") {
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["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_14__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopDebugListener();
}
if (id == "fork-dm-1") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopCopySelector();
}
if (id === "reactDevTools") {
if (enabled) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();else _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].stop();
}
if (id === "lightcord-1") {
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
}
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_22__["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_22__["default"].disable();
}
if (id === "lightcord-3") {
if (enabled) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(false);
}
if (id === "lightcord-4") {
if (enabled) {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
} else {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].disable();
}
}
if (id === "lightcord-6") {
if (enabled) {
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].enable();
} else {
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].disable();
}
}
this.saveSettings();
}
async initializeSettings() {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"].reactDevTools) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["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_22__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_26__["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_14__["default"].startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_14__["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"));
}
showOriginal() {
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(this.root);
this.root.style.display = "none";
_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("." + BDModules.get(e => e.contentRegion)[0].contentRegion.split(" ")[0] + ", .content-region").style.display = "";
}
renderSidebar() {
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
for (const element of tabs) {
element.removeEventListener("click", this.showOriginal);
element.addEventListener("click", this.showOriginal);
}
this.sidebar.render();
}
get coreComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
key: "cspanel",
onChange: this.onChange,
sections: this.coreSettings
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get lightcordComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
key: "lspannel",
onChange: this.onChange,
sections: this.lightcordSettings
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get PresenceComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__["default"], {
key: "lppannel",
onChange: this.onChange,
settings: this.PresenceSettings
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get AccountInfosComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__["default"], {
key: "lapannel"
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get customCssComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__["default"], {
key: "csseditor"
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
renderCoreSettings() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.coreComponent, root);
}
renderLightcordSettings() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.lightcordComponent, root);
}
renderPresenceSettings() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.PresenceComponent, root);
}
renderAccountInfos() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.AccountInfosComponent, root);
}
renderCustomCssEditor() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.customCssComponent, root);
} // renderAddonPane(type) {
// const root = this.root;
// if (!root) return Utils.err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
// BDV2.reactDom.render(this.contentComponent(type), root);
// }
renderAddonPane(type) {
if (!this.root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i"); // 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", "");
this.onChange = this.onChange.bind(this);
}
componentDidMount() {
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-reloaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-loaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-unloaded`, this.onChange);
}
componentWillUnmount() {
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-reloaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-loaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-unloaded`, this.onChange);
}
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
});
const list = type === "plugins" ? Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, {
type,
onChange: this.sideBarOnClick
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_20__["default"], {
type,
list
})), this.root);
}
}());
/***/ }),
/***/ "./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; });
/* 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 _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_sidebar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/sidebar */ "./src/ui/sidebar.js");
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
class V2_SettingsPanel_Sidebar {
constructor(onClick) {
this.onClick = onClick;
}
get items() {
return [{
text: "Lightcord Settings",
id: "lightcord"
}, {
text: "BetterDiscord Settings",
id: "core"
}, {
text: "Plugins",
id: "plugins"
}, {
text: "Themes",
id: "themes"
}, {
text: "Custom CSS",
id: "customcss"
}, {
text: "RichPresence",
id: "status"
},
/*{
text: "Message Logger",
id: "msglog"
}, */
{
text: "Account Info",
id: "accountinfo"
}];
}
get component() {
//<TooltipWrap color="black" side="top" text={title}>
const changelogButton = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__["default"], {
color: "black",
side: "top",
text: "Changelog"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "bd-changelog-button",
onClick: () => {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
}
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_5__["default"], {
className: "bd-icon",
size: "16px"
})));
return _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", null, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_sidebar__WEBPACK_IMPORTED_MODULE_4__["default"], {
onClick: this.onClick,
headerText: "Bandaged BD",
headerButton: changelogButton,
items: this.items
}));
}
get root() {
const _root = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#bd-settings-sidebar");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
const tabs = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].queryAll("[class*='side-'] > [class*='item-']:not([class*=Danger])");
const changeLog = tabs[tabs.length - 1];
if (!changeLog) return false;
changeLog.parentElement.insertBefore(_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div id="bd-settings-sidebar">`), changeLog.previousElementSibling);
return true;
}
render() {
const root = this.root;
if (!root) {
console.log("FAILED TO LOCATE ROOT: [class*='side-'] > [class*='item-']:not([class*=Danger])");
return;
}
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(this.component, root);
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].onRemoved(root, () => {
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(root);
});
}
}
/***/ }),
/***/ "./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 {
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));
}
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 bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdplugin) return;
this.unloadTheme(bdplugin.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.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();
}
}
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];
const cancel = () => {
if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console
what[methodName] = origMethod;
};
what[methodName] = function () {
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 ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.key && m.key() == "confirm-modal");
if (!ModalStack || !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 ModalStack.push(ConfirmationModal, {
header: title,
children: content,
red: danger,
confirmText: confirmText,
cancelText: cancelText,
onConfirm: onConfirm,
onCancel: onCancel
}, 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 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 => {
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return null;
if (!theModule.getToken && !theModule.getEmail && !theModule.showToken) return theModule;
const proxy = new Proxy(theModule, {
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") return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa";
if (func == "getEmail") return () => "puppet11112@gmail.com";
if (func == "showToken") return () => true; // if (func == "__proto__") return proxy;
return obj[func];
}
});
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);
if (m && filter(m)) return protect(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(protect(m.default));else if (m && filter(m)) modules.push(protect(m));
}
}
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"))];
}
initialize() {}
joinBD1() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd");
}
leaveBD1() {
this.GuildActions.leaveGuild("86004744966914048");
}
joinBD2() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j");
}
leaveBD2() {
this.GuildActions.leaveGuild("280806472928198656");
}
/**
* @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);
/* harmony default export */ __webpack_exports__["default"] = ({
find,
findAll,
findByProps,
findByPrototypes,
findByDisplayName
});
/***/ }),
/***/ "./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 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);
}
}), React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), 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)"
}), 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 React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), 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)"
}), 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/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 React.createElement("svg", _extends({
viewBox: "0 0 168 168.69"
}, props, {
height: "100%",
width: props.size
}), React.createElement("defs", null, 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"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a14"
})), 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"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e20613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
})), 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"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
}))), React.createElement("path", {
fill: "#fff",
d: "M14.9 35.3h139.2V133H14.9z"
}), 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)"
}), 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)"
}), 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");
/* 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 _select__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./select */ "./src/ui/select.jsx");
/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
let contentModule = BDModules.get(e => e.contentColumn)[0];
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 (!contentModule) contentModule = BDModules.get(e => e.contentColumn)[0];
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 React.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Account Infos"
}), React.createElement("div", null, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Profile"), React.createElement(CodeContent, {
content: this.getProfileValue(),
language: "diff"
}), React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Statistics"), React.createElement(CodeContent, {
content: this.getStatistics(),
language: "diff"
}), React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Connected Sessions"), React.createElement(CodeContent, {
content: this.getSessionValue(),
language: "diff"
})), 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}
+ active: ${e.active ? "Yes" : "No"}
+ Activities: ${e.activities.length}`;
}).join("\n" + "-".repeat(38) + "\n");
}
getProfileValue() {
const user = userModule.getCurrentUser();
/**
* @type {Date}
*/
const createdAt = user.createdAt;
return `+ Username: ${user.username}
+ Discriminator: ${user.discriminator}
+ Tag: ${user.tag}
+ ID: ${user.id}
+ Avatar: ${user.avatar}
+ Avatar URL: https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.${user.avatar.startsWith("a_") ? "gif" : "png"}?size=4096
+ 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 React.createElement("div", {
class: `${messageModule1.markup} ${messageModule2.messageContent}`
}, React.createElement("pre", null, React.createElement("code", {
class: `${scrollbarModule1.scrollbarGhostHairline} hljs`,
dangerouslySetInnerHTML: {
__html: hightlightJS.highlight(this.props.language, this.props.content).value
}
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom8)[0].marginBottom8
}));
}
}
/***/ }),
/***/ "./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");
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
};
}
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) => {
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(".scroller");
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 React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
color: "black",
side: "top",
text: title
}, React.createElement("div", {
className: "bd-addon-button",
onClick: action
}, children));
}
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;
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-closed ui-switch-item"
}, _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", React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
className: "bd-icon"
}), this.edit), this.props.remove && this.makeButton("Delete", React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
className: "bd-icon"
}), this.delete), this.props.reload && this.makeButton("Reload", 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 _tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools */ "./src/ui/tools.js");
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scroller */ "./src/ui/scroller.js");
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.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_13__["default"].findByDisplayName("Tooltip");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].react;
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_10__["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_8__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_8__["themeCookie"];
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"];
this.sort = this.sort.bind(this);
this.reverse = this.reverse.bind(this);
this.search = this.search.bind(this);
}
openFolder() {
__webpack_require__(/*! electron */ "electron").shell.openItem(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["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_14__["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: this.edit.bind(this),
remove: this.delete.bind(this),
addon: addon
};
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
getAddons() {
const sortedAddons = this.props.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(React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({}, props, {
reload: !_0globals__WEBPACK_IMPORTED_MODULE_8__["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);
}
render() {
const refreshIcon = React.createElement(Tooltip, {
color: "black",
position: "top",
text: "Reload List"
}, props => React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, {
className: "bd-icon bd-reload bd-reload-header",
size: "18px",
onClick: async () => {
if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"].updateThemeList();
this.forceUpdate();
}
})));
const addonCards = this.getAddons();
return React.createElement(_scroller__WEBPACK_IMPORTED_MODULE_5__["default"], {
contentColumn: true,
fade: true,
dark: true
}, React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], {
title: `${this.props.type.toUpperCase()}—${addonCards.length}`
}, React.createElement("button", {
key: "folder-button",
className: "bd-button bd-pfbtn",
onClick: this.openFolder.bind(this)
}, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && refreshIcon, React.createElement("div", {
className: "bd-controls bd-addon-controls"
}, React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_7__["default"], {
onChange: this.search,
placeholder: `Search ${this.props.type}...`
}), React.createElement("div", {
className: "bd-addon-dropdowns"
}, React.createElement("div", {
className: "bd-select-wrapper"
}, React.createElement("label", {
className: "bd-label"
}, "Sort by:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
options: this.sortOptions,
onChange: this.sort,
style: "transparent"
})), React.createElement("div", {
className: "bd-select-wrapper"
}, React.createElement("label", {
className: "bd-label"
}, "Order:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
options: this.directions,
onChange: this.reverse,
style: "transparent"
})))), React.createElement("div", {
className: "bda-slist bd-addon-list"
}, addonCards)), React.createElement(_tools__WEBPACK_IMPORTED_MODULE_2__["default"], {
key: "tools"
}));
}
}
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 React.createElement("div", {
className: "bd-select-options"
}, this.props.options.map(opt => 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 React.createElement("div", {
className: `bd-select${style}${isOpen}`,
onClick: this.showMenu,
ref: this.dropdown
}, React.createElement("div", {
className: "bd-select-value"
}, this.selected.label), 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 React.createElement("div", {
className: "bd-search-wrapper"
}, React.createElement("input", {
onChange: this.props.onChange,
onKeyDown: this.props.onKeyDown,
type: "text",
className: "bd-search",
placeholder: this.props.placeholder,
maxLength: "50"
}), 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() {
if (this.props.disabled) return;
this.props.onChange(!this.state.checked);
this.setState({
checked: !this.state.checked
});
}
render() {
const enabledClass = this.props.disabled ? " bd-switch-disabled" : "";
const checkedClass = this.state.checked ? " bd-switch-checked" : "";
return React.createElement("div", {
className: `bd-switch` + enabledClass + checkedClass
}, React.createElement("input", {
type: "checkbox",
id: this.props.id,
className: `bd-checkbox`,
disabled: this.props.disabled,
checked: this.state.checked,
onChange: this.onChange
}));
}
}
/***/ }),
/***/ "./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];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, this.props.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;
let contentModule = BDModules.get(e => e.contentColumn)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, 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 React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), 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"
}), 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 React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, 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 React.createElement("svg", {
className: this.props.className || "",
viewBox: "0 0 24 24",
fill: "#FFFFFF",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, 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"
}), 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 React.createElement("svg", {
viewBox: "0 0 24 24",
fill: "#FFFFFF",
className: this.props.className || "",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}), 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 React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), 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/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 _select__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./select */ "./src/ui/select.jsx");
/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_8__);
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
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();
}
}
/**
*
* @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: []
});
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();
}).catch(() => {
this.isfetching = false;
this.setState({
data: this.state.data,
assets: []
});
this.forceUpdate();
});
}
updatePreview(data) {
this.setState({
data
});
}
render() {
let contentModule = BDModules.get(e => e.contentColumn)[0];
return React.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
title: "RichPresence Settings",
settings: this.props.settings,
onChange: this.props.onChange
}), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "RichPresence"
}), React.createElement("div", null, RPCProps.map(e => {
if (e.type === "text") {
return React.createElement(InputText, {
setting: e,
manager: this,
id: e.id
});
} else if (e.type === "number") {
let array = [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 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.";
}
}
})), React.createElement("div", null, React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Preview"
}), React.createElement(RpcPreview, {
settings: this
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom20)[0].marginBottom20
}), React.createElement("button", {
style: {
opacity: 0.01
},
onClick: window.ohgodohfuck
}, "Oh god Oh fuck"), React.createElement("button", {
style: {
opacity: 0.01
},
onclick: () => {
electron__WEBPACK_IMPORTED_MODULE_8__["remote"].shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4", {
activate: true
});
}
}, "See ? I pulled a litle sneaky on ya"));
}
}
const RPCProps = [{
title: "Application ID",
id: "application_id",
type: "number"
}, {
title: "Name",
id: "name",
type: "text"
}, {
title: "Details",
id: "details",
type: "text"
}, {
title: "State",
id: "state",
type: "text"
}, {
title: "Timestamp Start",
id: "timestamps.start",
type: "number"
}, {
title: "LargeAsset",
id: "assets.large",
type: "choice"
}, {
title: "SmallAsset",
id: "assets.small",
type: "choice"
}];
class InputText extends React.Component {
render() {
let setting = this.props.setting;
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
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 flexModule = BDModules.get(e => e._horizontal)[0];
let inputModule = BDModules.get(e => e.inputMini)[0];
let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement("div", {
className: inputModule.inputWrapper
}, React.createElement("input", {
class: `${inputModule.inputDefault} ${sizeModule2.size16}`,
name: "state",
type: "text",
placeholder: "",
maxlength: "999",
value: this.props.manager.state.data[setting.id],
onChange: ev => {
this.props.manager.onChange(this, ev.target.value);
}
}))), React.createElement("div", {
class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`
}));
}
}
class InputNumber extends React.Component {
render() {
let setting = this.props.setting;
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
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 flexModule = BDModules.get(e => e._horizontal)[0];
let inputModule = BDModules.get(e => e.inputMini)[0];
let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];
let euhModule1 = BDModules.get(e => e.colorTransparent)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement("div", {
className: inputModule.inputWrapper
}, React.createElement("input", {
class: `${inputModule.inputDefault} ${sizeModule2.size16}`,
name: "state",
type: "text",
placeholder: "",
maxlength: "999",
value: this.props.manager.state.data[setting.id],
onChange: ev => {
let newValue = ev.target.value.replace(/[^\d]+/g, "");
if (newValue !== ev.target.value) {
ev.target.value = newValue;
}
this.props.manager.onChange(this, newValue);
}
})), setting.id === "timestamps.start" ? React.createElement("div", {
className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper
}, React.createElement("button", {
type: "button",
class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,
style: {
flex: "0 1 auto"
},
onClick: () => {
DiscordNative.clipboard.copy(Date.now() + "");
}
}, React.createElement("div", {
class: euhModule1.contents
}, "Copy current timestamp"))) : null), React.createElement("div", {
class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`
}));
}
}
class InputChoice extends React.Component {
onChange(data) {
this.props.manager.onChange(this, data.value === "none" ? null : data.value.replace("asset-", ""));
}
render() {
let setting = this.props.setting;
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
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 flexModule = BDModules.get(e => e._horizontal)[0];
let options = this.props.choices;
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement(_select__WEBPACK_IMPORTED_MODULE_6__["default"], {
value: "asset-" + this.props.manager.state.data[setting.id] || false,
onChange: this.onChange.bind(this),
options: options
})), React.createElement("div", {
class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].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];
let euhModule1 = BDModules.get(e => e.colorTransparent)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("div", {
className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper
}, React.createElement("button", {
type: "button",
class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,
style: {
flex: "0 1 auto"
},
onClick: this.onClick
}, React.createElement("div", {
class: euhModule1.contents
}, 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() {
let preview = new this.preview({
preview: this
});
preview.setState(this.state.rpc);
return React.createElement("div", {
className: "lc-tabWrapper"
}, React.createElement("div", {
className: "lc-tabnav",
style: {
flex: "0 1 auto"
}
}, React.createElement(Tab, {
preview: this,
title: "Full Profile",
id: "profile"
}), React.createElement(Tab, {
preview: this,
title: "User Popout",
id: "popout"
})), preview.render());
}
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 React.createElement("div", {
className: className,
onClick: () => {
this.props.preview.changeTab(this);
}
}, this.props.title);
}
}
class Popout extends React.Component {
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1] = [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]];
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
timestampClass = timestampClass || activityModule1.timestamp;
return React.createElement("div", {
className: "lc-userPopout"
}, React.createElement("div", {
class: rootModule1.userPopout,
role: "dialog",
tabindex: "-1"
}, React.createElement("div", {
class: rootModule1.headerPlaying
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: rootModule1.avatarWrapperNormal,
role: "button",
tabindex: "0"
}, React.createElement("div", {
class: avatarModule1,
role: "img",
style: {
width: "80px",
height: "80px"
}
}, React.createElement("svg", {
width: "92",
height: "80",
viewBox: "0 0 92 80",
class: `${avatarModule1.mask} ${avatarModule1.svg}`
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("img", {
src: avatarURL,
alt: " ",
class: avatarModule1.avatar
})), React.createElement(Status, null))), React.createElement("svg", {
width: "80",
height: "80",
class: rootModule1.avatarHint,
viewBox: "0 0 80 80"
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("div", {
class: rootModule1.avatarHintInner
}, Messages.VIEW_PROFILE)))), React.createElement("div", {
class: rootModule1.headerText
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`
}, React.createElement("span", {
class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`
}, user.username), React.createElement("span", null, "#", user.discriminator))))), React.createElement("div", {
class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`
}, React.createElement("h3", {
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
class: activityModule1.bodyNormal
}, (() => {
if (!data["assets.large"]) return null;
let images = [];
if (data["assets.large"]) {
images.push(React.createElement("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(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
class: activityModule1.assetsSmallImageUserPopout
}));
}
return React.createElement("div", {
class: activityModule1.assets
}, images);
})(), React.createElement("div", {
class: activityModule1.contentImagesUserPopout,
style: {
flex: "1 1 auto"
}
}, (() => {
if (!data.name) return null;
return React.createElement("h3", {
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
title: data.name
}, React.createElement("span", {
class: activityModule1.activityName
}, data.name));
})(), (() => {
if (!data.details) return null;
return React.createElement("div", {
title: data.title,
class: activityModule1.details
}, data.details);
})(), (() => {
if (!data.state) return null;
return React.createElement("div", {
class: activityModule1.state
}, React.createElement("span", {
title: data.state
}, data.state));
})(), (() => {
if (!data["timestamps.start"]) return null;
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__["default"])(Timestamp, Messages);
return React.createElement("div", {
class: activityModule1.timestamp
}, React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
}));
})())))), React.createElement("div", {
class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`
}, React.createElement("div", {
class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`
}, React.createElement("div", {
class: rootModule1.bodyTitle
}, Messages.NOTE), React.createElement("div", {
class: `${noteModule1.note} ${rootModule1.note}`
}, React.createElement("textarea", {
placeholder: Messages.NOTE_PLACEHOLDER,
maxlength: "256",
autocorrect: "off",
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
style: {
height: "36px"
},
disabled: true
})))), React.createElement("div", {
class: rootModule1.footer
}, React.createElement("div", {
class: `${rootModule1.protip} ${protipModule1.inline}`
}, React.createElement("h3", {
class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,
style: {
color: "rgb(67, 181, 129)"
}
}, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement("div", {
class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`
}, Messages.CONTEXT_MENU_HINT)))));
}
}
class Status extends React.Component {
render() {
let status = BDModules.get(e => e.default && e.default.getPresence)[0].default.getPresence().status;
if (status === "invisible") status = "offline";
let className = BDModules.get(e => e.pointerEvents)[0].pointerEvents;
return React.createElement("rect", {
width: "16",
height: "16",
x: "60",
y: "60",
fill: "#ffffff",
mask: `url(#svg-mask-status-${status})`,
className: className
});
}
}
let timestampClass = "";
class Profile extends React.Component {
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = [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];
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
timestampClass = timestampClass || activityModule1.timestamp;
return [React.createElement("div", {
className: "lc-tab"
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: rootModule1.topSectionPlaying
}, React.createElement("header", {
class: rootModule1.header
}, React.createElement("div", {
class: `${rootModule1.avatar} ${avatarModule1.wrapper}`,
role: "img",
style: {
width: "80px",
height: "80px"
}
}, React.createElement("svg", {
width: "92",
height: "80",
viewBox: "0 0 92 80",
class: `${avatarModule1.mask} ${avatarModule1.svg}`
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("img", {
src: avatarURL,
alt: " ",
class: avatarModule1.avatar
})), React.createElement(Status, null))), React.createElement("div", {
class: `${rootModule1.headerInfo}`
}, React.createElement("div", {
class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}`
}, React.createElement("span", {
class: `${rootModule1.username} ${rootModule1.username}`
}, user.username), React.createElement("span", {
class: rootModule1.discriminator
}, "#", user.discriminator)), React.createElement("div", {
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`,
style: {
flex: "1 1 auto"
}
}, React.createElement(Badges, null)))), React.createElement("div", {
class: rootModule1.headerFill
}, React.createElement("div", {
class: `${activityModule1.activityProfile} ${rootModule1.activity}`
}, React.createElement("h3", {
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
class: activityModule1.bodyNormal
}, (() => {
if (!data["assets.large"]) return null;
let images = [];
if (data["assets.large"]) {
images.push(React.createElement("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(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
class: activityModule1.assetsSmallImageProfile
}));
}
return React.createElement("div", {
class: activityModule1.assets
}, images);
})(), React.createElement("div", {
class: activityModule1.contentImagesProfile,
style: {
flex: "1 1 auto"
}
}, (() => {
if (!data.name) return null;
return React.createElement("h3", {
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
title: data.name
}, React.createElement("span", {
class: activityModule1.activityName
}, data.name));
})(), (() => {
if (!data.details) return null;
return React.createElement("div", {
title: data.title,
class: activityModule1.details
}, data.details);
})(), (() => {
if (!data.state) return null;
return React.createElement("div", {
class: activityModule1.state
}, React.createElement("span", {
title: data.state
}, data.state));
})(), (() => {
if (!data["timestamps.start"]) return null;
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__["default"])(Timestamp, Messages);
return React.createElement("div", {
class: activityModule1.timestamp
}, React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
}));
})()))))), React.createElement("div", {
class: rootModule1.body
}, React.createElement("div", {
class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`
}, React.createElement("div", {
class: scrollerModule1.scroller
}, React.createElement("div", {
class: rootModule1.userInfoSection
}, React.createElement("div", {
class: rootModule1.userInfoSectionHeader
}, Messages.NOTE), React.createElement("div", {
class: `${rootModule1.note} ${noteModule1.note}`
}, React.createElement("textarea", {
placeholder: Messages.NOTE_PLACEHOLDER,
maxlength: "256",
autocorrect: "off",
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
style: {
height: "40px"
},
disabled: true
}))), React.createElement(ConnectedAccounts, null)))))), React.createElement("div", {
class: "lc- "
})];
}
}
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(React.createElement(ConnectedAccount, {
acc: acc
}));
}
if (accounts.length > 0) {
return React.createElement("div", {
class: rootModule1.userInfoSection
}, React.createElement("div", {
class: rootModule1.connectedAccounts
}, accounts));
}
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 React.createElement("div", {
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`,
style: {
flex: "0 1 auto"
}
}, React.createElement("img", {
alt: `Logo ${constantsSocial.name}`,
class: rootModule1.connectedAccountIcon,
src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey
}), React.createElement("div", {
class: rootModule1.connectedAccountNameInner
}, React.createElement("div", {
class: rootModule1.connectedAccountName
}, acc.name), acc.verified ? React.createElement("span", null, React.createElement("div", {
class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`,
style: {
width: "16px",
height: "16px"
}
}, React.createElement("svg", {
class: flowerModule1.flowerStar,
width: "16",
height: "16",
viewBox: "0 0 16 15.2"
}, 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"
})), React.createElement("div", {
class: flowerModule1.childContainer
}, React.createElement("svg", {
width: "16",
height: "16",
viewBox: "0 0 16 15.2"
}, React.createElement("path", {
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z",
fill: "#ffffff"
}))))) : null), React.createElement("a", {
class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`,
rel: "noreferrer noopener",
target: "_blank",
role: "button",
tabindex: "0"
}, React.createElement("svg", {
class: rootModule1.connectedAccountOpenIcon,
width: "24",
height: "24",
viewBox: "0 0 24 24"
}, React.createElement("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"
}), React.createElement("path", {
fill: "currentColor",
d: "M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z"
}))));
}
}
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(React.createElement(Badge, {
name: searchable
}));
}
if (user.hasPremiumSubscription) {
badges.push(React.createElement(Badge, {
name: "profileBadgePremium"
}));
}
return badges;
}
}
class Badge extends React.Component {
render() {
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
return React.createElement("div", {
class: rootModule1.profileBadgeWrapper
}, React.createElement("div", null, React.createElement("div", {
class: "",
role: "button",
tabindex: "0"
}, React.createElement("div", {
class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}`
}))));
}
}
class Timestamp extends React.Component {
render() {
return React.createElement("div", {
className: timestampClass
}, this.props.message);
}
}
/***/ }),
/***/ "./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://cdn.discordapp.com/icons/705908350218666117/05a5652f7d1d0ae328ca7d6e2354a82a.webp",
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)
}), _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));
}
}
/***/ }),
/***/ "./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");
class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
}, this.props.sections.map(section => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, {
onChange: this.props.onChange
}));
}));
}
}
/***/ }),
/***/ "./src/ui/select.jsx":
/*!***************************!*\
!*** ./src/ui/select.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");
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
class Select extends React.Component {
handleChange(value) {
this.props.value = value;
if (typeof this.props.onChange == "function") this.props.onChange(value, this);
this.forceUpdate();
}
render() {
let flex = BDModules.get(e => e.default && e.default.Wrap && e.default.Direction && e.default.Child)[0].default;
let nativeSelect = BDModules.get(e => e.default && e.default.displayName === "SelectTempWrapper")[0].default;
return React.createElement("flex", {
direction: flex.Direction.HORIZONTAL,
align: flex.Align.CENTER
}, React.createElement(nativeSelect, Object.assign({}, this.props, {
onChange: this.handleChange.bind(this)
})));
/*
return BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.Flex, {
className: BDFDB.disCN.selectwrapper,
direction: InternalComponents.LibraryComponents.Flex.Direction.HORIZONTAL,
align: InternalComponents.LibraryComponents.Flex.Align.CENTER,
children: BDFDB.ReactUtils.createElement(InternalComponents.NativeSubComponents.Select, Object.assign({}, this.props, {
onChange: this.handleChange.bind(this)
}))
});*/
}
}
;
/***/ }),
/***/ "./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/settingsPanel.js":
/*!*********************************!*\
!*** ./src/ui/settingsPanel.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_SettingsPanel; });
/* 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_SettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
settings
} = this.props;
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: this.props.title
}), this.props.button && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
key: "title-button",
className: "bd-pfbtn",
onClick: this.props.button.onClick
}, this.props.button.title), 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 " + BDModules.get(e => e.marginTop60)[0].marginTop60
}, this.props.text);
}
}
/***/ }),
/***/ "./src/ui/sidebar.js":
/*!***************************!*\
!*** ./src/ui/sidebar.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_SideBar; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabBarSeparator */ "./src/ui/tabBarSeparator.js");
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tabBarHeader */ "./src/ui/tabBarHeader.js");
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tabBarItem */ "./src/ui/tabBarItem.js");
class V2C_SideBar extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
const si = document.querySelector("[class*=side-] > [class*=selected]");
if (si) this.scn = si.className;
const ns = document.querySelector("[class*=side-] > [class*='item-']:not([class*=selected])");
if (ns) this.nscn = ns.className;
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
for (const element of tabs) {
element.addEventListener("click", () => {
this.setState({
selected: null
});
});
}
this.setInitialState();
this.onClick = this.onClick.bind(this);
this.setSelected = this.setSelected.bind(this);
}
setInitialState() {
const self = this;
self.state = {
selected: null,
items: self.props.items
};
const initialSelection = self.props.items.find(item => {
return item.selected;
});
if (initialSelection) {
self.state.selected = initialSelection.id;
}
}
render() {
const self = this;
const {
headerText
} = self.props;
const {
items,
selected
} = self.state;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: headerText,
button: this.props.headerButton
}), items.map(item => {
const {
id,
text
} = item;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_3__["default"], {
key: id,
selected: selected === id,
text: text,
id: id,
onClick: self.onClick
});
}));
}
setSelected(e) {
e.target.className = this.scn;
}
onClick(id) {
const si = document.querySelector("[class*=side] > [class*=selected]");
if (si) {
si.removeEventListener("click", this.setSelected);
si.addEventListener("click", this.setSelected);
si.className = this.nscn;
}
this.setState({
selected: null
});
this.setState({
selected: id
});
if (this.props.onClick) this.props.onClick(id);
}
}
/***/ }),
/***/ "./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");
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() {
const {
text,
info
} = this.props.data;
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 _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
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");
/***/ }),
/***/ "request":
/*!**************************!*\
!*** external "request" ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("request");
/***/ }),
/***/ "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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3JlYWN0RGV2VG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2xpZ2h0Y29yZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BY2NvdW50SW5mb3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wcmVzZW5jZVNldHRpbmdzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NlcnZlckNhcmQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NpZGViYXJWaWV3LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Njcm9sbGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NlbGVjdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc0dyb3VwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc3dpdGNoLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySGVhZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySXRlbS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhclNlcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RpbWVzdGFtcFJlbmRlci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXBXcmFwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkveFN2Zy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImVsZWN0cm9uXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImV2ZW50c1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJta2RpcnBcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibW9kdWxlXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm5vZGUtZmV0Y2hcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicGF0aFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJyZXF1ZXN0XCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJpbXJhZlwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJ5YXV6bFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJiYmRDaGFuZ2Vsb2ciLCJkZXNjcmlwdGlvbiIsImNoYW5nZXMiLCJ0aXRsZSIsIml0ZW1zIiwidHlwZSIsInNldHRpbmdzIiwiaWQiLCJpbmZvIiwiaW1wbGVtZW50ZWQiLCJoaWRkZW4iLCJjYXQiLCJjYXRlZ29yeSIsImRlZmF1bHRDb29raWUiLCJzZXR0aW5nc0Nvb2tpZSIsInNldHRpbmdzUlBDIiwiZGVmYXVsdFJQQyIsIkRhdGUiLCJub3ciLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwiQkRWMiIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwic2V0Q29uZmlnIiwiaW5pdCIsInJlcXVpcmUiLCJ2MkxvYWRlciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRXaW5kb3dHZXR0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJIVE1MSUZyYW1lRWxlbWVudCIsInByb3RvdHlwZSIsImNvbnRlbnRXaW5kb3ciLCJSZWZsZWN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJQcm94eSIsIm9iaiIsInByb3AiLCJ1bmRlZmluZWQiLCJ2YWwiLCJiaW5kIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJGdW5jdGlvbiIsIm9PcGVuIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwidXJsIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsIlRGSG91ciIsImluamVjdDI0SG91ciIsImNhbmNlbDI0SG91ciIsInR3ZWx2ZUhvdXIiLCJSZWdFeHAiLCJjb252ZXJ0IiwiZGF0YSIsIm1hdGNoZWQiLCJyZXR1cm5WYWx1ZSIsIm1hdGNoIiwibGVuZ3RoIiwicmVwbGFjZSIsInBhZFN0YXJ0IiwicGFyc2VJbnQiLCJjYW5jZWxDb3p5IiwibW9ua2V5UGF0Y2giLCJUaW1lRm9ybWF0dGVyIiwiYWZ0ZXIiLCJjYW5jZWxDb21wYWN0IiwicmVtb3ZlMjRIb3VyIiwiZGlzcGF0Y2hlciIsIkxpZ2h0Y29yZCIsIkRpc2NvcmRNb2R1bGVzIiwiQ2hhbm5lbE1vZHVsZSIsIkJETW9kdWxlcyIsImUiLCJkZWZhdWx0IiwiZ2V0Q2hhbm5lbCIsImhhc0NoYW5uZWwiLCJyZWxhdGlvblNoaXBNb2R1bGUiLCJhZGRSZWxhdGlvbnNoaXAiLCJETU1vZHVsZSIsImNsb3NlUHJpdmF0ZUNoYW5uZWwiLCJibG9ja2VkIiwidXNlck1vZHVsZSIsImdldEN1cnJlbnRVc2VyIiwiQW50aUJvdERNIiwiYW50aURNIiwiZW5hYmxlZCIsImVuYWJsZSIsInN1YnNjcmliZSIsImRpc2FibGUiLCJ1bnN1YnNjcmliZSIsImV2IiwibWVzc2FnZSIsImF1dGhvciIsImJvdCIsImd1aWxkX2lkIiwiY2hhbm5lbCIsImNoYW5uZWxfaWQiLCJzY2FuTWVzc2FnZSIsInNob3dUb2FzdCIsInVzZXJuYW1lIiwiZGlzY3JpbWluYXRvciIsImxvY2F0aW9uIiwidGVzdCIsImNvbnRlbnQiLCJFbWJlZHNDb250YWlucyIsInNlYXJjaCIsImVtYmVkcyIsIm1hcCIsImVtYmVkIiwiZm9vdGVyIiwidGV4dCIsImZpZWxkcyIsIm5hbWUiLCJtIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsInByb2Nlc3MiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIlJlYWN0IiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsImNzcyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmlsdGVyIiwiV2VicGFja01vZHVsZXMiLCJmaW5kIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJwcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkV2ZW50RW1pdHRlciIsImV2ZW50TmFtZSIsImFyZ3MiLCJlbWl0Iiwib2ZmIiwiZXZlbnRBY3Rpb24iLCJyZW1vdmVMaXN0ZW5lciIsInNlbGVjdG9ycyIsInJlbW92ZURhIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwicHVzaCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidXNlclNldHRpbmdzQWNjb3VudCIsInZpZXdCb2R5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicGF0Y2hDbGFzc01vZHVsZXMiLCJub3JtYWxpemVFbGVtZW50IiwicGF0Y2hET01NZXRob2RzIiwibW9kdWxlcyIsIm1vZHVsZSIsInBhdGNoQ2xhc3NNb2R1bGUiLCJ1bnBhdGNoQ2xhc3NNb2R1bGUiLCJzaG91bGRJZ25vcmUiLCJpc05hTiIsImVuZHNXaXRoIiwic3RhcnRzV2l0aCIsIkFycmF5IiwiaXNBcnJheSIsIl9fZXNNb2R1bGUiLCJiYXNlQ2xhc3NOYW1lIiwic3BsaXQiLCJjb21wb25lbnROYW1lIiwiY2xhc3NOYW1lcyIsImNsYXNzTGlzdCIsIm5vcm1hbENsYXNzIiwiY2FtZWxDYXNlIiwicyIsImkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiam9pbiIsIm5ld1N0cmluZyIsInRyaW0iLCJlbGVtZW50IiwiY2xhc3NlcyIsImMiLCJjbGVuIiwibmV3Q2xhc3MiLCJhZGQiLCJjaGlsZCIsImNoaWxkcmVuIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidG9SZW1vdmUiLCJyZW1vdmUiLCJjb250YWlucyIsIkRPTVRva2VuTGlzdCIsInRva2VuIiwidG9rZW5zIiwidCIsIkNvbG9yZWRUZXh0IiwiaW5qZWN0Q29sb3JlZFRleHQiLCJjYW5jZWxDb2xvcmVkVGV4dCIsIk1lc3NhZ2VDb21wb25lbnQiLCJiZWZvcmUiLCJtZXRob2RBcmd1bWVudHMiLCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50IiwibWVzc2FnZUNvbnRlbnQiLCJkaXNwbGF5TmFtZSIsIm9yaWdpbmFsVHlwZSIsIl9fb3JpZ2luYWxNZXRob2QiLCJyb2xlQ29sb3IiLCJjb2xvclN0cmluZyIsInN0eWxlIiwiY29sb3IiLCJhc3NpZ24iLCJyZW1vdmVDb2xvcmVkVGV4dCIsImNsYXNzTmFtZU1hcmt1cCIsIm1hcmt1cCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZWxlbSIsInNldFByb3BlcnR5IiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJyZW1vdGUiLCJhcHAiLCJnZXRBcHBQYXRoIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsInRpbWVDYWNoZSIsIndhdGNoZXJzIiwiZ2V0Q29udGVudFJlcXVpcmUiLCJwbHVnaW5zRm9sZGVyIiwiX3BsdWdpbnNGb2xkZXIiLCJyZWFscGF0aFN5bmMiLCJkYXRhUGF0aCIsInRoZW1lc0ZvbGRlciIsIl90aGVtZXNGb2xkZXIiLCJ3YXRjaENvbnRlbnQiLCJjb250ZW50VHlwZSIsImlzUGx1Z2luIiwiYmFzZUZvbGRlciIsImZpbGVFbmRpbmciLCJ3YXRjaCIsInBlcnNpc3RlbnQiLCJldmVudFR5cGUiLCJmaWxlbmFtZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsInN0YXRTeW5jIiwiZXJyIiwiY29kZSIsInVubG9hZFBsdWdpbiIsInVubG9hZFRoZW1lIiwiaXNGaWxlIiwic3RhdHMiLCJtdGltZSIsImdldFRpbWUiLCJsb2FkUGx1Z2luIiwibG9hZFRoZW1lIiwicmVsb2FkUGx1Z2luIiwicmVsb2FkVGhlbWUiLCJ1bndhdGNoQ29udGVudCIsImNsb3NlIiwiZXh0cmFjdE1ldGEiLCJmaXJzdExpbmUiLCJoYXNPbGRNZXRhIiwicGFyc2VPbGRNZXRhIiwiaGFzTmV3TWV0YSIsInBhcnNlTmV3TWV0YSIsIm1ldGEiLCJyYXdNZXRhIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwicGFyc2VkIiwiZm9ybWF0IiwiYmxvY2siLCJvdXQiLCJmaWVsZCIsImFjY3VtIiwibGluZSIsImNoYXJBdCIsImwiLCJzdWJzdHIiLCJzZWxmIiwib3JpZ2luYWxSZXF1aXJlIiwicG9zc2libGVQYXRoIiwiYmFzZW5hbWUiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3RyaXBCT00iLCJhZGRlZCIsImF0aW1lTXMiLCJtb2RpZmllZCIsIm10aW1lTXMiLCJzaXplIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9jb21waWxlIiwiZGlkRXhwb3J0IiwiaXNFbXB0eSIsImV4cG9ydHMiLCJtYWtlUGxhY2Vob2xkZXJQbHVnaW4iLCJnZXROYW1lIiwiZ2V0QXV0aG9yIiwiZ2V0RGVzY3JpcHRpb24iLCJzb3VyY2UiLCJ3ZWJzaXRlIiwibG9hZENvbnRlbnQiLCJmaWxlIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImNvbmZpZyIsImZsYXQiLCJ2ZXJzaW9uIiwiRUQiLCJXZWJTb2NrZXQiLCJsYXRlc3RMb2NhbFZlcnNpb24iLCJ1cGRhdGVyIiwiTGF0ZXN0VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJjb25maXJtVGV4dCIsIm9uQ29uZmlybSIsIm9uVXBkYXRlRmFpbGVkIiwiZGlkVXBkYXRlIiwidXBkYXRlSW5qZWN0b3IiLCJyZWxhdW5jaCIsImV4aXQiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJhdG9iIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNsaWNrIiwiUGx1Z2luQ2VydGlmaWVyIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImluaXRPYnNlcnZlciIsInNob3dDb250ZW50RXJyb3JzIiwicGx1Z2lucyIsInRoZW1lcyIsInByZXZpb3VzVmVyc2lvbiIsInNob3dDaGFuZ2Vsb2dNb2RhbCIsImVtb2ppTW9kdWxlIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsImlubmVySFRNTCIsInRpbWVzQ2hlY2tlZCIsIndyYXBwZXIiLCJndWlsZENsYXNzZXMiLCJndWlsZCIsImxpc3RJdGVtIiwiYmxvYiIsImJsb2JDb250YWluZXIiLCJkZWZlckxvYWRlZCIsInJlYWR5U3RhdGUiLCJpbmplY3RFeHRlcm5hbHMiLCJvcmlnaW5hbCIsImdldFNldHRpbmdHcm91cCIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJtYWluT2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwibWxlbiIsIm11dGF0aW9uIiwicmF3T2JzZXJ2ZXIiLCJhZGRlZE5vZGVzIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImxheWVyIiwiYW5pbWF0aW5nIiwic29jaWFsTGlua3MiLCJzZXRBdHRyaWJ1dGUiLCJnZXRFbGVtZW50QnlJZCIsInJlbmRlclNpZGViYXIiLCJwYXJlbnRFbGVtZW50Iiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJzb2NpYWxQYXRjaCIsIlRhYkJhciIsIkFuY2hvciIsInRvU3RyaW5nIiwic29jaWFsTW9kdWxlMSIsIm5ld09uZSIsInJldHVyblZhbCIsIlRvb2x0aXBXcmFwIiwic2lkZSIsImxpbmsiLCJocmVmIiwidGFyZ2V0IiwiTGlnaHRjb3JkTG9nbyIsIkJETG9nbyIsImNsYXNzTmFtZUNvbG9yTXV0ZWQiLCJzaXplcyIsImNsYXNzTmFtZVZlcnNpb25IYXNoIiwiY29sb3JNdXRlZCIsInNpemUzMiIsInZlcnNpb25IYXNoIiwiaGFzaCIsImJyYW5jaCIsImFkZGl0aW9uYWwiLCJyZWFjdCIsInNpemUxMiIsImVsZWN0cm9uIiwiZ2V0R2xvYmFsIiwiY29tbWl0Iiwib3JpZ2luYWxWZXJzaW9ucyIsInNwbGljZSIsImdldEd1aWxkQ2xhc3NlcyIsImd1aWxkc1dyYXBwZXIiLCJmaW5kQnlQcm9wcyIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJ1dWlkdjQiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJkaXNwbGF5IiwiYXBwbHlCYWRnZXMiLCJ1c2VyIiwiY2hhdCIsIm5leHRUaWNrIiwiZGl2IiwiY2hpbGROb2RlcyIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJ0aGVuIiwiYmFkZ2VzIiwic3ZnIiwid2lkdGgiLCJzY29wZXMiLCJzY29wZSIsImNvbXBvbmVudCIsImRpdjIiLCJyZWFjdERvbSIsInJlbmRlciIsIm1lbWJlckxpc3RQYXRjaCIsIk1lbWJlckxpc3RJdGVtIiwicmVuZGVyRGVjb3JhdG9ycyIsImluamVjdGlvblBhdGgiLCJybXJmIiwieWF1emwiLCJta2RpcnAiLCJyZXF1ZXN0IiwicGFyZW50UGF0aCIsImZvbGRlck5hbWUiLCJ6aXBMaW5rIiwic2F2ZWRaaXAiLCJleHRyYWN0ZWRGb2xkZXIiLCJzdWNjZXNzIiwiZW5jb2RpbmciLCJyZXNwb25zZSIsInN0YXR1c0NvZGUiLCJhbHJlYWR5RXhpc3RzIiwicmVzIiwiZXhpc3RzIiwicmVuYW1lIiwicm91bmQiLCJwZXJmb3JtYW5jZSIsIndyaXRlRmlsZSIsInppcGZpbGUiLCJsYXp5RW50cmllcyIsInppcCIsIm9uIiwiZW50cnkiLCJmaWxlTmFtZSIsInJlYWRFbnRyeSIsImZ1bGxQYXRoIiwic3luYyIsImRpcm5hbWUiLCJvcGVuUmVhZFN0cmVhbSIsInJlYWRTdHJlYW0iLCJwaXBlIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJvbmNlIiwiYmFja3VwRm9sZGVyIiwidW5saW5rIiwicmVsZWFzZUNoYW5uZWwiLCJnbG9iYWxzIiwiZ2V0UmVsZWFzZUNoYW5uZWwiLCJzdGFibGUiLCJjYW5hcnkiLCJwdGIiLCJwbHVnaW5EYXRhIiwiQkRGaWxlIiwid3JpdGVGaWxlU3luYyIsInBhcnNlIiwic2V0dGluZ3NGaWxlIiwidW5saW5rU3luYyIsIl9pbmplY3Rpb25QYXRoIiwiYmFzZSIsInJvYW1pbmdCYXNlIiwiZ2V0UGF0aCIsInJvYW1pbmdMb2NhdGlvbiIsInJlYWxMb2NhdGlvbiIsImNvbmZpZ0ZpbGUiLCJfY29uZmlnRmlsZSIsIl9CREZpbGUiLCJfc2V0dGluZ3NGaWxlIiwiZ2V0UGx1Z2luRmlsZSIsInNldFNldHRpbmdHcm91cCIsIkRldk1vZGUiLCJkZWJ1Z0xpc3RlbmVyIiwiY29weVNlbGVjdG9yTGlzdGVuZXIiLCJzdGFydERlYnVnTGlzdGVuZXIiLCJzdGFydENvcHlTZWxlY3RvciIsInN0b3BEZWJ1Z0xpc3RlbmVyIiwic3RvcENvcHlTZWxlY3RvciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3aGljaCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwic2VsZWN0b3IiLCJnZXRTZWxlY3RvciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJjb250ZXh0TWVudSIsImF0dGFjaCIsImNtIiwicXVlcnkiLCJjb250YWluZXIiLCJjbVdyYXAiLCJhcHBlbmQiLCJ0b3AiLCJjbGllbnRZIiwibGVmdCIsImNsaWVudFgiLCJ6SW5kZXgiLCJyZW1vdmVDTSIsImtleUNvZGUiLCJjbWciLCJpdGVtR3JvdXAiLCJjbWkiLCJpdGVtIiwiY2xpY2thYmxlIiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5Iiwic2Nyb2xsSGVpZ2h0IiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJmcm9tIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJnZXRSdWxlcyIsInN0eWxlU2hlZXRzIiwic2hlZXRzIiwicnVsZXMiLCJjc3NSdWxlcyIsImVsZW1lbnRSdWxlcyIsInNlbGVjdG9yVGV4dCIsIm1hdGNoZXMiLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwiZGVsZXRlIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJBcGkiLCJBdXRob3JpemF0aW9uIiwianNvbiIsImNhdGNoIiwibmV3UHJvbWlzZSIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJzZXRJbW1lZGlhdGUiLCJ1c2VycyIsInJlc3BvbnNlQm9keSIsInByb21pc2UiLCJ1c2VyX2lkIiwicm91dGUiLCJub2RlRmV0Y2giLCJTRVJWRVJfVVJMIiwiaGVhZGVycyIsIkxpZ2h0Y29yZFVzZXJCYWRnZSIsIkJ1Z0h1bnRlckJhZGdlIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJ0aW1pbmciLCJfIiwidXBkYXRlIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJxdWVyeUFsbCIsImh0bWwiLCJmcmFnbWVudCIsInRlbXBsYXRlIiwiY2xvbmVOb2RlIiwiZXNjYXBlSFRNTCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJzcGFuRWxlbWVudCIsIm5vZGVWYWx1ZSIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJ0b2dnbGVDbGFzcyIsImNsYXNzbmFtZSIsImluZGljYXRvciIsImhhc0NsYXNzIiwiZXZlcnkiLCJyZXBsYWNlQ2xhc3MiLCJvbGROYW1lIiwibmV3TmFtZSIsImFwcGVuZFRvIiwidGhpc05vZGUiLCJ0aGF0Tm9kZSIsInByZXBlbmRUbyIsInByZXBlbmQiLCJpbnNlcnRBZnRlciIsInRhcmdldE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsIm5ld05vZGUiLCJuZXh0IiwibmV4dEFsbCIsIm5leHRVbnRpbCIsInByZXZpb3VzIiwicHJldmlvdXNBbGwiLCJwcmV2aW91c1VudGlsIiwiaW5kZXhJblBhcmVudCIsIm51bSIsImluZGV4IiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsImV2ZW50IiwiZGVsZWdhdGUiLCJuYW1lc3BhY2UiLCJoYXNEZWxlZ2F0ZSIsImV2ZW50RnVuYyIsImNhbmNlbCIsIm5ld0NhbmNlbCIsImZpbmRJbmRleCIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJlbGVtZW50cyIsImRvbVdyYXBwZXIiLCJyZXNvbHZlRWxlbWVudCIsIkVtb2ppUmVnZXgiLCJDdXN0b21FbW9qaU1vZHVsZSIsIkN1c3RvbUVtb2ppIiwiRW1vamlNb2R1bGVBcGkiLCJnZXRDdXN0b21FbW9qaUJ5SWQiLCJBdXRvY29tcGxldGVNb2R1bGUiLCJBdXRvQ29tcGxldGlvblRlbXBsYXRlcyIsImdldEF1dG9jb21wbGV0ZU9wdGlvbnMiLCJFbW9qaU1vZHVsZVF1ZXJ5IiwicXVlcnlFbW9qaVJlc3VsdHMiLCJNZXNzYWdlcyIsIkVNT0pJX01BVENISU5HIiwiZ3VpbGRNb2R1bGUiLCJnZXRHdWlsZCIsImdldEd1aWxkcyIsImlzRmV0Y2hpbmciLCJlbW9qaVNlYXJjaCIsImdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQiLCJlbnN1cmVFeHBvcnRlZCIsImNhbGwiLCJMSUdIVENPUkRfRU1PSklTIiwiYXJnMSIsImFyZzIiLCJjb25kaXRpb24iLCJzZXRFbW9qaVVzYWJsZSIsInF1ZXJ5UmVzdWx0cyIsInJlc3VsdHMiLCJyZW5kZXJSZXN1bHRzIiwiRCIsImVtb2ppcyIsIkVNT0pJIiwiRW1vamkiLCJlbW9qaSIsInVuaXF1ZU5hbWUiLCJzZW50aW5lbCIsImd1aWxkSWQiLCJnZXRQbGFpblRleHQiLCJpc0FuaW1hdGVkIiwiYW5pbWF0ZWQiLCJtYW5hZ2VkIiwib3JpZ2luYWxOYW1lIiwiZ2V0UmF3VGV4dCIsImNhbmNlbEVtb2ppUmVuZGVyIiwiY2FuY2VsRW1vdGVSZW5kZXIiLCJuZXdDb250ZW50IiwiaGFzUGFyc2VkIiwiZXhlYyIsInJhdyIsIndvcmRzIiwid29yZCIsImFyciIsImVtb2ppSWQiLCJqdW1ib2FibGUiLCJyZWR1Y2UiLCJjdXJyZW50Iiwic2hpZnQiLCJvIiwidSIsImQiLCJvbkNsaWNrIiwib25Ib3ZlciIsIlIiLCJwcmVmaXgiLCJUaXRsZSIsIkVtb2ppRmlsdGVyTW9kdWxlIiwiaXNFbW9qaURpc2FibGVkIiwiaXNVc2FibGUiLCJ1c2FibGUiLCJzdXJyb2dhdGVzIiwiZGl2ZXJzaXR5IiwiZGVidWciLCJjYWNoZTIiLCJwcm9jZXNzQXR0YWNobWVudCIsImNoZWNrVmlydXNlcyIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsInN1c3BlY3QiLCJoYXNoVG9VcmwiLCJwb3AiLCJoYXJtIiwicmVuZGVyVG9FbGVtZW50cyIsIm5leHRIYXNoIiwiZ2V0Q3VycmVudFdlYkNvbnRlbnRzIiwidXNlckFnZW50IiwicmVzdWx0IiwiY3J5cHRvIiwiQnVmZmVyIiwiYWxsb2MiLCJjaHVuayIsImNvbmNhdCIsImhhc2hSZXN1bHQiLCJkaWdlc3QiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiZGFuZ2VyIiwib25DYW5jZWwiLCJzaGVsbCIsIm9wZW5FeHRlcm5hbCIsInRvb2x0aXBXcmFwIiwidmlld0JveCIsIngiLCJ5IiwibWFzayIsImZpbGwiLCJwb2ludGVyRXZlbnRzIiwib2ZmaWNpYWwiLCJmbG93ZXJTdGFyIiwic3Ryb2tlIiwiUGx1Z2luTW9kdWxlIiwibG9hZFBsdWdpbkRhdGEiLCJsb2FkIiwic2F2ZVBsdWdpbkRhdGEiLCJjaGFubmVsU3dpdGNoIiwic3RhcnRQbHVnaW4iLCJzdG9wUGx1Z2luIiwiZW5hYmxlUGx1Z2luIiwiZGlzYWJsZVBsdWdpbiIsInRvZ2dsZVBsdWdpbiIsInAiLCJmaWxlbmFtZU9yTmFtZSIsImJkcGx1Z2luIiwiZWRpdCIsIm9wZW5JdGVtIiwidXBkYXRlUGx1Z2luTGlzdCIsInNhdmVkIiwibmV3TWVzc2FnZSIsIm9uTWVzc2FnZSIsIm9uU3dpdGNoIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJMYXllciIsInJvb3RJZCIsIlYyQ19QdWJsaWNTZXJ2ZXJzIiwicm9vdCIsIl9yb290IiwiaW5qZWN0Um9vdCIsImNsYXNzTmFtZUxheWVycyIsImxheWVycyIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWVTY3JvbGxlciIsInNjcm9sbGVyIiwic2Nyb2xsYmFyV2lkdGgiLCJhZGRCdXR0b24iLCJndWlsZFBhdGNoIiwiR3VpbGRMaXN0Iiwid2VicGFja01vZHVsZXMiLCJHdWlsZExpc3RPbGQiLCJyZW1vdmVCdXR0b24iLCJCcm93c2VyV2luZG93Iiwid2ViQ29udGVudHMiLCJyZWFjdERldlRvb2xzIiwiZXh0ZW5zaW9uUGF0aCIsInBsYXRmb3JtIiwiZW52IiwiTE9DQUxBUFBEQVRBIiwiSE9NRSIsInZlcnNpb25zIiwiaXNFeHRlbnNpb25JbnN0YWxsZWQiLCJyZW1vdmVEZXZUb29sc0V4dGVuc2lvbiIsImRpZEluc3RhbGwiLCJhZGREZXZUb29sc0V4dGVuc2lvbiIsImlzRGV2VG9vbHNPcGVuZWQiLCJWMl9TZXR0aW5nc1BhbmVsIiwic2lkZUJhck9uQ2xpY2siLCJ1cGRhdGVTZXR0aW5ncyIsInNpZGViYXIiLCJWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIiLCJzaG93T3JpZ2luYWwiLCJjbGFzc1NpZGViYXIiLCJjb250ZW50UmVnaW9uIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsImNvcmVTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiY2F0ZWdvcmllcyIsIlNldCIsInNlY3Rpb25zIiwibGlnaHRjb3JkU2V0dGluZ3MiLCJQcmVzZW5jZVNldHRpbmdzIiwiTXNnTG9nU2V0dGluZ3MiLCJyZW5kZXJDb3JlU2V0dGluZ3MiLCJyZW5kZXJDdXN0b21Dc3NFZGl0b3IiLCJyZW5kZXJBZGRvblBhbmUiLCJyZW5kZXJMaWdodGNvcmRTZXR0aW5ncyIsInJlbmRlclByZXNlbmNlU2V0dGluZ3MiLCJyZW5kZXJBY2NvdW50SW5mb3MiLCJjaGVja2VkIiwicHVibGljU2VydmVyc01vZHVsZSIsInZvaWNlTW9kZSIsInRmSG91ciIsImNvbG9yZWRUZXh0IiwiZE1vZGUiLCJTZXR0aW5ncyIsImRldk1vZGUiLCJjYWxsUmluZ2luZ0JlYXQiLCJzZXR0aW5nc1N0b3JlIiwic2hvd0N1cnJlbnRHYW1lIiwidXBkYXRlUmVtb3RlU2V0dGluZ3MiLCJnZXRDdXJyZW50V2luZG93Iiwic2V0QWx3YXlzT25Ub3AiLCJBbnRpQWRETSIsImJsdXJQcml2YXRlIiwidGFicyIsImNvcmVDb21wb25lbnQiLCJTY3JvbGxlciIsImNvbnRlbnRDb2x1bW4iLCJmYWRlIiwiZGFyayIsIlNlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJUb29scyIsImxpZ2h0Y29yZENvbXBvbmVudCIsIlByZXNlbmNlQ29tcG9uZW50IiwiVjJDX1ByZXNlbmNlU2V0dGluZ3MiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJWMkNfQWNjb3VudEluZm9zIiwiY3VzdG9tQ3NzQ29tcG9uZW50IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJjb21wb25lbnREaWRNb3VudCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib3JpZ2luYWxSZW5kZXIiLCJlbnVtZXJhYmxlIiwiQ2FyZExpc3QiLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwiU2lkZUJhciIsImhlYWRlclRleHQiLCJoZWFkZXJCdXR0b24iLCJjaGFuZ2VMb2ciLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJ0aGVtZSIsInVuZXNjYXBlIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInRlbXBSZXQiLCJfX21vbmtleVBhdGNoZWQiLCJkaXNjb25uZWN0IiwiaGFzTm90aWNlIiwibWVtYmVybGlzdCIsIm1lbWJlcnNXcmFwIiwiZm9ybSIsInJpZ2h0IiwiYm90dG9tIiwidG9hc3RXcmFwcGVyIiwiaWNvbiIsInRpbWVvdXQiLCJ0b2FzdEVsZW0iLCJpbm5lclRleHQiLCJtb2RhbE1vZHVsZSIsIm1vZGFsIiwiaW5uZXIiLCJoaWRlT25GdWxsc2NyZWVuIiwiaGVhZGVyTW9kdWxlIiwiaGVhZGVyIiwicmVzcG9uc2l2ZVdpZHRoTW9iaWxlIiwiZm9vdGVyMk1vZHVsZSIsImZvY3VzTG9jayIsImJhY2tkcm9wIiwiYmFja2Ryb3BXaXRoTGF5ZXIiLCJjbG9zaW5nTGlzdGVuZXJzIiwicGx1Z2luRXJyb3JzIiwidGhlbWVFcnJvcnMiLCJnZW5lcmF0ZVRhYiIsIk1vZGFsU3RhY2siLCJDaGFuZ2Vsb2dDbGFzc2VzIiwiVGV4dEVsZW1lbnQiLCJGbGV4Q2hpbGQiLCJUaXRsZXMiLCJDaGFuZ2Vsb2ciLCJkZWZhdWx0UHJvcHMiLCJzZWxlY3RhYmxlIiwiTWFya2Rvd25QYXJzZXIiLCJpbWFnZSIsInN1YnRpdGxlIiwiY2UiLCJjaGFuZ2Vsb2dJdGVtcyIsIm1hcmdpbiIsIm1hcmdpblRvcCIsInJlbmRlckhlYWRlciIsIkNoaWxkIiwiZ3JvdyIsInNocmluayIsInRhZyIsIlRhZ3MiLCJINCIsIlNpemVzIiwiU01BTEwiLCJDb2xvcnMiLCJTVEFOREFSRCIsImRhdGUiLCJyZW5kZXJGb290ZXIiLCJBbmNob3JDbGFzc2VzIiwiYW5jaG9yIiwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlciIsImpvaW5TdXBwb3J0U2VydmVyIiwiam9pbkJEMiIsInN1cHBvcnRMaW5rIiwiZGVmYXVsdEZvb3RlciIsIm9uU2Nyb2xsIiwiTWFya2Rvd24iLCJDb25maXJtYXRpb25Nb2RhbCIsImVtcHR5RnVuY3Rpb24iLCJyZWQiLCJCZXR0ZXJEaXNjb3JkIiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsInByb3h5IiwiZnVuYyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwicmVhY3RDb21wb25lbnQiLCJhbmNob3JDbGFzc2VzIiwic2xhdGVFZGl0b3JDbGFzc2VzIiwibWVzc2FnZUNsYXNzZXMiLCJ1bnJlYWRNZW50aW9uc0JhciIsImd1aWxkc0Vycm9yIiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJUb29sdGlwV3JhcHBlciIsIlRvb2x0aXBzIiwiaGlkZSIsInNob3ciLCJzdWJtaXQiLCJhY3RpdmF0ZVJhZ2luZ0RlbW9uIiwiZGlzbWlzcyIsIktleUdlbmVyYXRvciIsIkxheWVyU3RhY2siLCJVc2VyU3RvcmUiLCJDaGFubmVsU3RvcmUiLCJDaGFubmVsQWN0aW9ucyIsIlByaXZhdGVDaGFubmVsQWN0aW9ucyIsIm9wZW5ETSIsInVzZXJJZCIsInNlbGZJZCIsInByaXZhdGVDaGFubmVsSWQiLCJnZXRETUZyb21Vc2VySWQiLCJzZWxlY3RQcml2YXRlQ2hhbm5lbCIsIm9wZW5Qcml2YXRlQ2hhbm5lbCIsInBhcnNlU2V0dGluZ3MiLCJWb2ljZU1vZGUiLCJwcm9maWxNb2R1bGUiLCJmZXRjaE11dHVhbEZyaWVuZHMiLCJjb250ZW50TW9kdWxlIiwibWFyZ2luTW9kdWxlMiIsImRlZmF1bHRNYXJnaW5oNSIsImNvbG9yTW9kdWxlIiwiY29sb3JTdGFuZGFyZCIsInNpemVNb2R1bGUiLCJzY3JvbGxiYXJNb2R1bGUxIiwic2Nyb2xsYmFyR2hvc3RIYWlybGluZSIsIkd1aWxkTW9kdWxlIiwiZ2V0UmVsYXRpb25zaGlwcyIsInNlc3Npb25Nb2R1bGUiLCJnZXRTZXNzaW9ucyIsImNvbnRlbnRDb2x1bW5EZWZhdWx0IiwicGFkZGluZyIsInNpemUxNCIsImg1IiwiZ2V0UHJvZmlsZVZhbHVlIiwiZ2V0U3RhdGlzdGljcyIsImdldFNlc3Npb25WYWx1ZSIsIm1hcmdpbkJvdHRvbTIwIiwic2Vzc2lvbnNSYXciLCJzZXNzaW9ucyIsInNlc3Npb25JZCIsImNsaWVudEluZm8iLCJvcyIsImNsaWVudCIsImFjdGl2ZSIsImFjdGl2aXRpZXMiLCJyZXBlYXQiLCJjcmVhdGVkQXQiLCJhdmF0YXIiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRGdWxsWWVhciIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJmbGFncyIsImhhc1ByZW1pdW1TdWJzY3JpcHRpb24iLCJlbWFpbCIsIm1mYUVuYWJsZWQiLCJtb2JpbGUiLCJwaG9uZSIsInZlcmlmaWVkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwiX19odG1sIiwibGFuZ3VhZ2UiLCJtYXJnaW5Cb3R0b204IiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJzZXRTdGF0ZSIsImNsb3NlU2V0dGluZ3MiLCJwYW5lbFJlZiIsInNldHRpbmdzT3BlbiIsImNvbXBvbmVudERpZFVwZGF0ZSIsInJlZnMiLCJzZXR0aW5nc3BhbmVsIiwiaXNIaWRkZW4iLCJjVG9wIiwic2Nyb2xsVG9wIiwiY0JvdHRvbSIsImVUb3AiLCJvZmZzZXRUb3AiLCJlQm90dG9tIiwiY2FyZE5vZGUiLCJ0aGlzTm9kZU9mZnNldCIsImNvbnRhaW5lck9mZnNldCIsImVuZFBvaW50IiwiZ2V0U3RyaW5nIiwic2V0dGluZ3NDb21wb25lbnQiLCJyZWYiLCJYU3ZnIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJidWlsZFRpdGxlIiwibmFtZUluZGV4IiwidmVyc2lvbkluZGV4IiwiYXV0aG9ySW5kZXgiLCJwb3BMYXllciIsIm1ha2VMaW5rIiwibWFrZUJ1dHRvbiIsImFjdGlvbiIsImxpbmtzIiwiaW52aXRlIiwidGVzdGVyIiwiZG9uYXRlIiwicGF0cmVvbiIsImRpc2FibGVkIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiU3dpdGNoIiwiVG9vbHRpcCIsImFzY2VuZGluZyIsImlzUGx1Z2lucyIsInJldmVyc2UiLCJvcGVuRm9sZGVyIiwic2hvdWxkRGVsZXRlIiwiY29uZmlybURlbGV0ZSIsInNvcnRPcHRpb25zIiwiZGlyZWN0aW9ucyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0UHJvcHMiLCJnZXRBZGRvbnMiLCJzb3J0ZWRBZGRvbnMiLCJiIiwiY2FwIiwiZmlyc3QiLCJzZWNvbmQiLCJsb2NhbGVDb21wYXJlIiwicmVuZGVyZWQiLCJyZWZyZXNoSWNvbiIsImZvcmNlVXBkYXRlIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJvcGFjaXR5IiwiVjJDX0NoZWNrYm94IiwiY2hlY2tib3hFbGVtZW50IiwiY2hlY2tib3giLCJjaGVja2JveElubmVyIiwiU2VsZWN0IiwiZHJvcGRvd24iLCJjcmVhdGVSZWYiLCJzaG93TWVudSIsImhpZGVNZW51Iiwib3B0IiwiaXNPcGVuIiwiU2VhcmNoIiwib25LZXlEb3duIiwicGxhY2Vob2xkZXIiLCJlbmFibGVkQ2xhc3MiLCJjaGVja2VkQ2xhc3MiLCJWMkNfQ29udGVudENvbHVtbiIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiZWRpdG9yIiwiYWNlIiwic2V0VGhlbWUiLCJzZXNzaW9uIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImRldGFjaGVkUm9vdCIsImNvZGVNaXJyb3IiLCJsaW5lTnVtYmVycyIsIm1vZGUiLCJpbmRlbnRVbml0Iiwic2Nyb2xsYmFyU3R5bGUiLCJfY2NzcyIsImNjc3MiLCJ1cGRhdGVMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJTZXR0aW5nc1RpdGxlIiwiQ2hlY2tib3giLCJib3JkZXJSYWRpdXMiLCJib3JkZXJSaWdodCIsImJvcmRlckxlZnQiLCJmb250U2l6ZSIsIm1hcmdpbkxlZnQiLCJhcmciLCJnZXRWYWx1ZSIsImJ0b2EiLCJkcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwiZGF0YVN0b3JlIiwicHJldmlldyIsImlzZmV0Y2hpbmciLCJkZWZhdWx0U2V0dGluZyIsIlJQQ1Byb3BzIiwiYXNzZXQiLCJ1cGRhdGVQcmV2aWV3IiwiYXJyYXkiLCJvaGdvZG9oZnVjayIsImFjdGl2YXRlIiwiSW5wdXRUZXh0Iiwicm93TW9kdWxlIiwicmVtb3ZlS2V5YmluZCIsIm1hcmdpbk1vZHVsZSIsImZsZXhNb2R1bGUiLCJfaG9yaXpvbnRhbCIsImlucHV0TW9kdWxlIiwiaW5wdXRNaW5pIiwic2l6ZU1vZHVsZTIiLCJzaXplMTYiLCJzaXplMjAiLCJyb3ciLCJmbGV4Q2hpbGQiLCJpbnB1dFdyYXBwZXIiLCJpbnB1dERlZmF1bHQiLCJkaXZpZGVyIiwiZGl2aWRlckRlZmF1bHQiLCJJbnB1dE51bWJlciIsImV1aE1vZHVsZTEiLCJjb2xvclRyYW5zcGFyZW50IiwibmV3VmFsdWUiLCJidXR0b25XcmFwcGVyIiwibG9va0ZpbGxlZCIsImNvbG9yQnJhbmQiLCJzaXplU21hbGwiLCJmbGV4IiwiY2xpcGJvYXJkIiwiY29udGVudHMiLCJJbnB1dENob2ljZSIsImNob2ljZXMiLCJEaXNjb3JkQnV0dG9uIiwiUnBjUHJldmlldyIsImNoYW5nZVRhYiIsInRhYiIsImFuY2llbnRUYWIiLCJzZXRBY3RpdmUiLCJycGMiLCJpc0FjdGl2ZSIsIlByb2ZpbGUiLCJQb3BvdXQiLCJUYWIiLCJhdmF0YXJVUkwiLCJnZXRBdmF0YXJVUkwiLCJyb290TW9kdWxlMSIsImZsZXhNb2R1bGUxIiwic3R5bGluZ01vZHVsZTEiLCJuYW1lVGFnTW9kdWxlMSIsImFjdGl2aXR5TW9kdWxlMSIsInRleHRNb2R1bGUxIiwic2l6ZU1vZHVsZTEiLCJzY3JvbGxlck1vZHVsZTEiLCJub3RlTW9kdWxlMSIsInByb3RpcE1vZHVsZTEiLCJjb2xvck1vZHVsZTEiLCJhdmF0YXJNb2R1bGUxIiwidXNlclBvcG91dCIsInZlcnRpY2FsIiwiYWxpZ25TdHJldGNoIiwic3RyZWFtZXJNb2RlRW5hYmxlZEJ0biIsImFjdGl2aXR5VXNlclBvcG91dCIsIm11dGVkIiwidGhlbWVHaG9zdEhhaXJsaW5lQ2hhbm5lbHMiLCJub3RlIiwicHJvIiwiaW5saW5lIiwidGltZXN0YW1wQ2xhc3MiLCJ0aW1lc3RhbXAiLCJoZWFkZXJQbGF5aW5nIiwianVzdGlmeUNlbnRlciIsImFsaWduQ2VudGVyIiwibm9XcmFwIiwiaGVhZGVyVG9wIiwiYXZhdGFyV3JhcHBlck5vcm1hbCIsImF2YXRhckhpbnQiLCJhdmF0YXJIaW50SW5uZXIiLCJWSUVXX1BST0ZJTEUiLCJob3Jpem9udGFsIiwianVzdGlmeVN0YXJ0IiwiaGVhZGVyVGFnTm9OaWNrbmFtZSIsIm5hbWVUYWciLCJoZWFkZXJUYWdVc2VybmFtZU5vTmlja25hbWUiLCJoZWFkZXJUZXh0Tm9ybWFsIiwiVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlORyIsImJvZHlOb3JtYWwiLCJpbWFnZXMiLCJhc3NldHNMYXJnZUltYWdlVXNlclBvcG91dCIsImFzc2V0c0xhcmdlTWFza1VzZXJQb3BvdXQiLCJhc3NldHNTbWFsbEltYWdlVXNlclBvcG91dCIsImNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0IiwibmFtZU5vcm1hbCIsImFjdGl2aXR5TmFtZSIsInRpbWVDb21wb25lbnQiLCJ0aW1lc3RhbXBSZW5kZXIiLCJUaW1lc3RhbXAiLCJlbmQiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyRmFkZSIsImJvZHlJbm5lciIsImJvZHlUaXRsZSIsIk5PVEUiLCJOT1RFX1BMQUNFSE9MREVSIiwicHJvdGlwIiwiUElOTkVEX01FU1NBR0VTX1BST19USVAiLCJ0aXAiLCJDT05URVhUX01FTlVfSElOVCIsIlN0YXR1cyIsImdldFByZXNlbmNlIiwidG9wU2VjdGlvblN0cmVhbWluZyIsImFjdGl2aXR5UHJvZmlsZSIsInRvcFNlY3Rpb25QbGF5aW5nIiwiaGVhZGVySW5mbyIsInByb2ZpbGVCYWRnZXMiLCJoZWFkZXJGaWxsIiwiYXNzZXRzTGFyZ2VJbWFnZVByb2ZpbGUiLCJhc3NldHNMYXJnZU1hc2tQcm9maWxlIiwiYXNzZXRzU21hbGxJbWFnZVByb2ZpbGUiLCJjb250ZW50SW1hZ2VzUHJvZmlsZSIsInVzZXJJbmZvU2VjdGlvbiIsInVzZXJJbmZvU2VjdGlvbkhlYWRlciIsIkNvbm5lY3RlZEFjY291bnRzIiwiYWNjb3VudHMiLCJBY2NvdW50TW9kdWxlMSIsImdldEFjY291bnRzIiwiYWNjcyIsInZpc2liaWxpdHkiLCJhY2MiLCJjb25uZWN0ZWRBY2NvdW50cyIsIkNvbm5lY3RlZEFjY291bnQiLCJmbG93ZXJNb2R1bGUxIiwiYW5jaG9yTW9kdWxlMSIsIlNvY2lhbENvbnN0YW50cyIsImNvbnN0YW50c1NvY2lhbCIsImNvbm5lY3RlZEFjY291bnQiLCJjb25uZWN0ZWRBY2NvdW50SWNvbiIsIndoaXRlIiwiZ3JleSIsImNvbm5lY3RlZEFjY291bnROYW1lSW5uZXIiLCJjb25uZWN0ZWRBY2NvdW50TmFtZSIsImNvbm5lY3RlZEFjY291bnRWZXJpZmllZEljb24iLCJjb25uZWN0ZWRBY2NvdW50T3Blbkljb24iLCJCYWRnZXMiLCJyb290TW9kdWxlIiwiVXNlckZsYWdzIiwic2VyaWFsaXplZCIsImZsYWdOYW1lIiwiaGFzRmxhZyIsInNlYXJjaGFibGUiLCJCYWRnZSIsInByb2ZpbGVCYWRnZVdyYXBwZXIiLCJwcm9maWxlQmFkZ2UiLCJWMkNfTGF5ZXIiLCJrZXl1cExpc3RlbmVyIiwidHJhbnNmb3JtIiwiY29tcG9uZW50V2lsbE1vdW50IiwiY2hhbmdlQ2F0ZWdvcnkiLCJzZWFyY2hLZXlEb3duIiwiY2hlY2tDb25uZWN0aW9uIiwiY29ubmVjdCIsIkd1aWxkU3RvcmUiLCJBdmF0YXJEZWZhdWx0cyIsIlNvcnRlZEd1aWxkU3RvcmUiLCJzZWxlY3RlZENhdGVnb3J5IiwibG9hZGluZyIsInNlcnZlcnMiLCJjb25uZWN0aW9uIiwiZmV0Y2giLCJzZXJ2ZXIiLCJqb2luZWQiLCJ0ZXJtIiwiY2F0ZWdvcnlCdXR0b25zIiwidG90YWwiLCJzYnYiLCJjb250ZW50U2Nyb2xsZXIiLCJzZXJ2ZXJDYXJkIiwicGlubmVkIiwiYWNjZXB0SW52aXRlIiwiaW52aXRlX2NvZGUiLCJqb2luRW5kUG9pbnQiLCJpZGVudGlmaWVyIiwiY3JlZGVudGlhbHMiLCJ3aW5kb3dPcHRpb25zIiwic2NyZWVuWCIsInNjcmVlblkiLCJqb2luV2luZG93IiwibG9hZFVSTCIsImJhY2tncm91bmRDb2xvciIsInJlc2l6YWJsZSIsIm1heGltaXphYmxlIiwibWluaW1pemFibGUiLCJhbHdheXNPblRvcCIsImNlbnRlciIsIndlYlByZWZlcmVuY2VzIiwibm9kZUludGVncmF0aW9uIiwiYmRTZXJ2ZXIiLCJvbmxpbmUiLCJtZW1iZXJzIiwiaWNvblVybCIsIm5hdGl2ZWpvaW4iLCJzZXJ2ZXIyIiwiZ3VpbGRMaXN0IiwiZ2V0RmxhdHRlbmVkR3VpbGRJZHMiLCJkZWZhdWx0TGlzdCIsIkRFRkFVTFRfQVZBVEFSUyIsIlNlcnZlckNhcmQiLCJmYWxsYmFjayIsImZsb29yIiwiY29ubmVjdEVuZFBvaW50IiwiU2lkZWJhclZpZXciLCJ0b29scyIsIlRhYkJhclNlcGFyYXRvciIsInNlYXJjaElucHV0IiwiVGFiQmFySGVhZGVyIiwiVGFiQmFySXRlbSIsIm1heExlbmd0aCIsInNlYXJjaGlucHV0Iiwibm90Q29ubmVjdGVkIiwiY29sdW1uTW9kdWxlIiwibWFyZ2luQm90dG9tIiwibWluSGVpZ2h0IiwibGluZUhlaWdodCIsIlYyQ19TZXJ2ZXJDYXJkIiwiaW1hZ2VFcnJvciIsImNhcmRNb2R1bGUiLCJjYXJkIiwiY2FyZFByaW1hcnkiLCJfaG9yaXpvbnRhbFJldmVyc2UiLCJ3cmFwTW9kdWxlIiwic3RyZWFtZXJNb2RlRW5hYmxlZCIsIm9uRXJyb3IiLCJoYW5kbGVFcnJvciIsIlYyQ19TaWRlYmFyVmlldyIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2Nyb2xsZXIiLCJzY3JvbGxlckhvcml6b250YWwiLCJzY3JvbGxlck1vZHVsZTIiLCJzaWRlYmFyUmVnaW9uU2Nyb2xsZXIiLCJ3cmFwcGVyQ2xhc3MiLCJzY3JvbGxlckNsYXNzIiwiY29udGVudFJlZ2lvblNjcm9sbGVyIiwiY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcCIsInRoZW1lR2hvc3QiLCJzY3JvbGxlclRyYWNrIiwiVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJzZWN0aW9uIiwiU2V0dGluZ3NHcm91cCIsImhhbmRsZUNoYW5nZSIsIldyYXAiLCJEaXJlY3Rpb24iLCJuYXRpdmVTZWxlY3QiLCJIT1JJWk9OVEFMIiwiQWxpZ24iLCJDRU5URVIiLCJWMkNfU2V0dGluZ3NHcm91cCIsImJ1dHRvbkNvbXBvbmVudCIsIlYyQ19TZXR0aW5nc1BhbmVsIiwiVjJDX1NldHRpbmdzVGl0bGUiLCJtYXJnaW5Ub3A2MCIsIlYyQ19TaWRlQmFyIiwic2kiLCJzY24iLCJucyIsIm5zY24iLCJzZXRTZWxlY3RlZCIsImluaXRpYWxTZWxlY3Rpb24iLCJTd2l0Y2hJdGVtIiwiVjJDX1RhYkJhckhlYWRlciIsIlYyQ19UYWJCYXJJdGVtIiwiVjJDX1RhYkJhclNlcGFyYXRvciIsImludGVydmFsTW9kdWxlMSIsIkludGVydmFsIiwiVGltZVJlbmRlciIsIlB1cmVDb21wb25lbnQiLCJfaW50ZXJ2YWwiLCJnZXRVcGRhdGVkVGltZSIsImdldERpZmYiLCJjaGVja1VuaXgiLCJob3VycyIsIm1pbnV0ZXMiLCJzZWNvbmRzIiwicmVuZGVyVGltZSIsIm51bWJlciIsInJlbW92ZVplcm8iLCJ1c2VkUHJvcHMiLCJVU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9FTkQiLCJVU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9TVEFSVCIsIlYyQ19Ub29scyIsInRvb2xzTW9kdWxlIiwidG9vbHNDb250YWluZXIiLCJjb250YWluZXJNb2R1bGUiLCJjbG9zZUJ1dHRvbiIsImNsb3NlQnV0dG9uQm9sZCIsImtleWJpbmQiLCJrZXliaW5kQm9sZCIsIlRvb2x0aXBDbGFzc2VzIiwiZ2V0VG9vbHRpcENsYXNzZXMiLCJUb29sdGlwTGF5ZXJzIiwiZ2V0VG9vbHRpcExheWVycyIsImdldENsYXNzIiwic2lkZU9yQ29sb3IiLCJ1cHBlckNhc2UiLCJ0b29sdGlwQ2xhc3MiLCJjbGFzc0V4aXN0cyIsInRvUHgiLCJFbXVsYXRlZFRvb2x0aXAiLCJwcmV2ZW50RmxpcCIsInRvb2x0aXBFbGVtZW50IiwidG9vbHRpcCIsImxhYmVsRWxlbWVudCIsInRvb2x0aXBDb250ZW50IiwicG9pbnRlckVsZW1lbnQiLCJ0b29sdGlwUG9pbnRlciIsInBvcG91dHMiLCJsYXllckNvbnRhaW5lciIsImNhblNob3dBYm92ZSIsImNhblNob3dCZWxvdyIsImNhblNob3dMZWZ0IiwiY2FuU2hvd1JpZ2h0IiwiX2NsYXNzTmFtZSIsInNob3dBYm92ZSIsInNob3dCZWxvdyIsInNob3dMZWZ0Iiwic2hvd1JpZ2h0IiwiY2VudGVySG9yaXpvbnRhbGx5IiwiY2VudGVyVmVydGljYWxseSIsIm5vZGVjZW50ZXIiLCJmaW5kRE9NTm9kZSIsIlYyQ19YU3ZnIl0sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFD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QUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdIOXpCLG1EQUFJLENBQUNtaUIsS0FBTCxDQUFXbGhCLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0MsZUFBUyxFQUFFLFlBQVo7QUFBMEIrN0IsVUFBSSxFQUFFLE1BQWhDO0FBQXdDK1osY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSWgzQyxtREFBSSxDQUFDbWlCLEtBQUwsQ0FBV2xoQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUMyNEIsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJNTVCLG1EQUFJLENBQUNtaUIsS0FBTCxDQUFXbGhCLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0MsZUFBUyxFQUFFLE1BQVo7QUFBb0IrN0IsVUFBSSxFQUFFLFNBQTFCO0FBQXFDckQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQzs7Ozs7Ozs7Ozs7QUNBQSxvQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxrQyIsImZpbGUiOiJtYWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCIvLyB2YXIgc2V0dGluZ3NQYW5lbCwgdm9pY2VNb2RlLCBwbHVnaW5Nb2R1bGUsIHRoZW1lTW9kdWxlLCBkTW9kZSwgcHVibGljU2VydmVyc01vZHVsZSwgbWFpbkNvcmUsIEJEVjI7XHJcbmV4cG9ydCBjb25zdCBtaW5pbXVtRGlzY29yZFZlcnNpb24gPSBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IGN1cnJlbnREaXNjb3JkVmVyc2lvbiA9ICh3aW5kb3cuRGlzY29yZE5hdGl2ZSAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24gJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24oKSkgfHwgXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBtaW5TdXBwb3J0ZWRWZXJzaW9uID0gXCIwLjMuMFwiO1xyXG5leHBvcnQgY29uc3QgYmJkVmVyc2lvbiA9IFwiMC4zLjRcIjtcclxuZXhwb3J0IGNvbnN0IGJiZENoYW5nZWxvZyA9IHtcclxuICAgIGRlc2NyaXB0aW9uOiBcIkxpZ2h0Y29yZCBFZGl0aW9uLlwiLFxyXG4gICAgY2hhbmdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiV2hhdCdzIE5ldz9cIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiKipMaWdodGNvcmQqKiBpcyBub3cgdXNpbmcgQmFuZGFnZWRCRC4gVGhhdCBtZWFucyBhbGwgcGx1Z2lucyB5b3Ugd2VyZSB1c2luZyBjYW4gYmUgdXNlZCB0b28gIVwiLFxyXG4gICAgICAgICAgICAgICAgXCIqKldpbmRvdyBUcmFuc3BhcmVuY3kqKiBjaGFuZ2VzIHdlcmUgbWFkZSB0byBtb3JlIGNvbXBhdGlibGUgd2l0aCBleHRlcm5hbCB3aW5kb3cgbWFuYWdlcnMgYW5kIGFkZG9ucyBsaWtlIEdsYXNzY29yZC5cIixcclxuICAgICAgICAgICAgICAgIFwiSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgaGFzIG9uY2UgYWdhaW4gYmVlbiBjaGFuZ2VkIHNsaWdodGx5IHRvIGhvcGVmdWxseSBpbXByb3ZlIGxvYWRpbmcgdGltZXMuXCIsXHJcbiAgICAgICAgICAgICAgICBcIldlIHJlbW92ZWQgZW1vdGVzLiBUaGF0J3Mgc2FkIGZvciBwZW9wbGUgd2hvIHdlcmUgYWN0dWFsbHkgdXNpbmcgaXQsIGJ1dCBpdCB3YXMgbGVhZGluZyB0byBtb3JlIGxvYWRpbmcgdGltZSBhbmQgc29tZSBiYXNpYyB3b3JkcyB3ZXJlIGVtb3RlLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiQnVnIEZpeGVzXCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiU29tZSBmaXhlcyByZWxhdGVkIHRvIHNob3dpbmcgbW9kYWxzIGluIHRoZSBgQmRBcGlgLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3MgPSB7XHJcbiAgICBcIkN1c3RvbSBjc3MgbGl2ZSB1cGRhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTBcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkN1c3RvbSBjc3MgYXV0byB1ZHBhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTFcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkJldHRlckRpc2NvcmQgQmx1ZVwiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtYlwiLCAgaW5mbzogXCJSZXBsYWNlIERpc2NvcmQgYmx1ZSB3aXRoIEJEIEJsdWVcIiwgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiBmYWxzZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCJ9LFxyXG5cclxuICAgIC8qIENvcmUgKi9cclxuICAgIC8qID09PT09PSAqL1xyXG4gICAgXCJQdWJsaWMgU2VydmVyc1wiOiAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTFcIiwgIGluZm86IFwiRGlzcGxheSBwdWJsaWMgc2VydmVycyBidXR0b25cIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk1pbmltYWwgTW9kZVwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMlwiLCAgaW5mbzogXCJIaWRlIGVsZW1lbnRzIGFuZCByZWR1Y2UgdGhlIHNpemUgb2YgZWxlbWVudHMuXCIsICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgTW9kZVwiOiAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy00XCIsICBpbmZvOiBcIk9ubHkgc2hvdyB2b2ljZSBjaGF0XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJIaWRlIENoYW5uZWxzXCI6ICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTNcIiwgIGluZm86IFwiSGlkZSBjaGFubmVscyBpbiBtaW5pbWFsIG1vZGVcIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkRhcmsgTW9kZVwiOiAgICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNVwiLCAgaW5mbzogXCJNYWtlIGNlcnRhaW4gZWxlbWVudHMgZGFyayBieSBkZWZhdWx0KHdpcClcIiwgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgRGlzY29ubmVjdFwiOiAgICAgICAgICAge2lkOiBcImJkYS1kYy0wXCIsICBpbmZvOiBcIkRpc2Nvbm5lY3QgZnJvbSB2b2ljZSBzZXJ2ZXIgd2hlbiBjbG9zaW5nIERpc2NvcmRcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCIyNCBIb3VyIFRpbWVzdGFtcHNcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLTZcIiwgIGluZm86IFwiUmVwbGFjZSAxMmhyIHRpbWVzdGFtcHMgd2l0aCBwcm9wZXIgb25lc1wiLCAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkNvbG9yZWQgVGV4dFwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtN1wiLCAgaW5mbzogXCJNYWtlIHRleHQgY29sb3IgdGhlIHNhbWUgYXMgcm9sZSBjb2xvclwiLCAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTm9ybWFsaXplIENsYXNzZXNcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNFwiLCBpbmZvOiBcIkFkZHMgc3RhYmxlIGNsYXNzZXMgdG8gZWxlbWVudHMgdG8gaGVscCB0aGVtZXMuIChlLmcuIGFkZHMgLmRhLWNoYW5uZWxzIHRvIC5jaGFubmVscy1JZTJsNkEpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuXHJcbiAgICAvKiBDb250ZW50ICovXHJcbiAgICBcIkNvbnRlbnQgRXJyb3IgTW9kYWxcIjogICAgICAgIHtpZDogXCJmb3JrLXBzLTFcIiwgaW5mbzogXCJTaG93cyBhIG1vZGFsIHdpdGggcGx1Z2luL3RoZW1lIGVycm9yc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2hvdyBUb2FzdHNcIjogICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtMlwiLCBpbmZvOiBcIlNob3dzIGEgc21hbGwgbm90aWZpY2F0aW9uIGZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjcm9sbCBUbyBTZXR0aW5nc1wiOiAgICAgICAgIHtpZDogXCJmb3JrLXBzLTNcIiwgaW5mbzogXCJBdXRvLXNjcm9sbHMgdG8gYSBwbHVnaW4ncyBzZXR0aW5ncyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCAob25seSBpZiBvdXQgb2YgdmlldylcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkF1dG9tYXRpYyBMb2FkaW5nXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTVcIiwgaW5mbzogXCJBdXRvbWF0aWNhbGx5IGxvYWRzLCByZWxvYWRzLCBhbmQgdW5sb2FkcyBwbHVnaW5zIGFuZCB0aGVtZXNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcblxyXG4gICAgLyogRGV2ZWxvcGVyICovXHJcbiAgICBcIkRldmVsb3BlciBNb2RlXCI6ICAgICAgICAgXHQgIHtpZDogXCJiZGEtZ3MtOFwiLCBpbmZvOiBcIkRldmVsb3BlciBNb2RlIFRvZ2dsZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJDb3B5IFNlbGVjdG9yXCI6XHRcdFx0ICB7aWQ6IFwiZm9yay1kbS0xXCIsIGluZm86IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJSZWFjdCBEZXZUb29sc1wiOlx0XHRcdCAge2lkOiBcInJlYWN0RGV2VG9vbHNcIiwgaW5mbzogXCJBZGRzIHJlYWN0IGRldmVsb3BlciB0b29scyB0byB0aGUgZGV2dG9vbHMuIE11c3QgYmUgaW5zdGFsbGVkIGluIEdvb2dsZSBDaHJvbWUgb24geW91ciBwYy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICBcIkRpc2FibGUgQmV0dGVyRGlzY29yZFwiOiAgICAgIHtpZDogXCJiZC1kaXNhYmxlXCIsICBpbmZvOiBcIkRpc2FibGUgQmV0dGVyZGlzY29yZCAocGx1Z2lucywgdGhlbWVzLCBldGMpLlwiLCBpbXBsZW1lbnRlZDogZmFsc2UsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJCbHVyIFBlcnNvbm5hbCBJbmZvcm1hdGlvbnNcIjp7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJDYWxsaW5nIFJpbmcgQmVhdFwiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTJcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIHNwZWNpYWwgY2FsbGluZyBiZWF0LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRldmVsb3BlciBPcHRpb25zXCI6ICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtMVwiLCBpbmZvOiBcIkVuYWJsZSBEaXNjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiIGFuZCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIuIChtdXN0IGNsb3NlIGFuZCByZW9wZW4gc2V0dGluZ3MpXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQWQgQmxvY2tcIjogICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC00XCIsIGluZm86IFwiQmxvY2sgYW55IEJPVCB0aGF0IGRtIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkRpc2FibGluZyBpdCBlcmFzZSBhbnkgaW5mb3JtYXRpb25zIGFib3V0IHlvdSBpbiBvdXIgc2VydmVycy4gQnV0IHlvdSB3b24ndCBzZWUgYW55dGhpbmcgbGlrZSBjdXN0b20gYmFkZ2VzLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCBXaW5kb3cgKi9cclxuICAgIFwiQWx3YXlzLW9uLVRvcFwiOiAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0zXCIsIGluZm86IFwiRW5hYmxlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFxyXG4gICAgLyoqIFJpY2hQcmVzZW5jZSAqL1xyXG4gICAgXCJFbmFibGVcIjogICAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIiwgaW5mbzogXCJFbmFibGUgUmljaFByZXNlbmNlIGJlbG93LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcInN0YXR1c1wifVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb29raWUgPSB7XHJcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy0yXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtM1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy01XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy02XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTJcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy02XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy03XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZGMtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTFcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy05XCI6IHRydWUsXHJcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1wcy0xXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtMlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy00XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcInJlYWN0RGV2VG9vbHNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlXHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzQ29va2llID0ge307XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NSUEMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSUEMgPSB7XHJcbiAgICBcIm5hbWVcIjogXCJMaWdodGNvcmRcIixcclxuICAgIFwiYXBwbGljYXRpb25faWRcIjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIixcclxuICAgIFwic3RhdGVcIjogXCJMaWdodGNvcmQgQ2xpZW50XCIsXHJcbiAgICBcImRldGFpbHNcIjogXCJCcm93c2luZyBEaXNjb3JkXCIsXHJcbiAgICBcInRpbWVzdGFtcHMuc3RhcnRcIjogRGF0ZS5ub3coKSxcclxuICAgIFwiYXNzZXRzLnNtYWxsXCI6IG51bGwsXHJcbiAgICBcImFzc2V0cy5sYXJnZVwiOiBcIjcxMjMyMzgyMTAzNzY4Mjc5MVwiXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBiZHBsdWdpbkVycm9ycyA9IFtdO1xyXG5leHBvcnQgY29uc3QgYmR0aGVtZUVycm9ycyA9IFtdOyAvLyBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcblxyXG5leHBvcnQgY29uc3QgYmRDb25maWcgPSBPYmplY3QuY3JlYXRlKEJldHRlckRpc2NvcmRDb25maWcpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJkdGhlbWVzID0ge307XHJcbmV4cG9ydCBjb25zdCBiZHBsdWdpbnMgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBwbHVnaW5Db29raWUgPSB7fTtcclxuZXhwb3J0IGNvbnN0IHRoZW1lQ29va2llID0ge307IiwiaW1wb3J0IGxvY2FsU3RvcmFnZUZpeCBmcm9tIFwiLi9sb2NhbFN0b3JhZ2VGaXhcIjtcclxuaW1wb3J0IGxvYWRpbmdJY29uIGZyb20gXCIuL2xvYWRpbmdJY29uXCI7XHJcbmxvY2FsU3RvcmFnZUZpeCgpO1xyXG5sb2FkaW5nSWNvbigpO1xyXG5cclxuY29uc3QgZGVwcmVjYXRlR2xvYmFsID0gKGtleSwgdmFsdWUpID0+IHtcclxuICAgIC8vIHZhbHVlID0gdHlwZW9mKHZhbHVlKSAhPT0gXCJvYmplY3RcIiA/IHZhbHVlIDogbmV3IFByb3h5KHZhbHVlLCB7XHJcbiAgICAvLyAgICAgZ2V0OiBmdW5jdGlvbihvYmosIG1vZCkge1xyXG4gICAgLy8gICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShtb2QpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gb2JqW21vZF07XHJcbiAgICAvLyAgICAgfSxcclxuICAgIC8vICAgICBzZXQ6IGZ1bmN0aW9uKG9iaiwgbW9kKSB7XHJcbiAgICAvLyAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobW9kKSkgcmV0dXJuIFV0aWxzLmVycihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIFwiVHJ5aW5nIHRvIG92ZXJ3cml0ZSBkZXByZWNhdGVkIEJEIGdsb2JhbHNcIik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCBrZXksIHtcclxuICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGVkIEdsb2JhbFwiLCBgXCIke2tleX1cIiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiBQbGVhc2Ugb25seSB1c2UgQmRBcGkuYCk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9KTsgIFxyXG59O1xyXG5cclxuXHJcbmltcG9ydCAqIGFzIEdsb2JhbHMgZnJvbSBcIi4vMGdsb2JhbHNcIjtcclxuXHJcbmNvbnN0IGdsb2JhbEtleXMgPSBPYmplY3Qua2V5cyhHbG9iYWxzKTtcclxuZm9yIChjb25zdCBrZXkgb2YgZ2xvYmFsS2V5cykgZGVwcmVjYXRlR2xvYmFsKGtleSwgR2xvYmFsc1trZXldKTtcclxuXHJcblxyXG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4vbW9kdWxlcy9iZEFwaVwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL21vZHVsZXMvdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL21vZHVsZXMvYmRFdmVudHNcIjtcclxuaW1wb3J0IHNldHRpbmdzUGFuZWwgZnJvbSBcIi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IENsYXNzTm9ybWFsaXplciBmcm9tIFwiLi9tb2R1bGVzL2NsYXNzTm9ybWFsaXplclwiO1xyXG5cclxuZGVwcmVjYXRlR2xvYmFsKFwiQkRWMlwiLCBCRFYyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwicGx1Z2luTW9kdWxlXCIsIHBsdWdpbk1vZHVsZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInRoZW1lTW9kdWxlXCIsIHRoZW1lTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiVXRpbHNcIiwgVXRpbHMpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJCREV2ZW50c1wiLCBCREV2ZW50cyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInNldHRpbmdzUGFuZWxcIiwgc2V0dGluZ3NQYW5lbCk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkRhdGFTdG9yZVwiLCBEYXRhU3RvcmUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJDb250ZW50TWFuYWdlclwiLCBDb250ZW50TWFuYWdlcik7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNsYXNzTm9ybWFsaXplclwiLCBDbGFzc05vcm1hbGl6ZXIpO1xyXG5cclxud2luZG93LkJkQXBpID0gQmRBcGk7XHJcblxyXG5pbXBvcnQgQ29yZSBmcm9tIFwiLi9tb2R1bGVzL2NvcmVcIjtcclxuZGVwcmVjYXRlR2xvYmFsKFwibWFpbkNvcmVcIiwgQ29yZSk7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmVXcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGJkQ29uZmlnKSB7XHJcbiAgICAgICAgQ29yZS5zZXRDb25maWcoYmRDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgLy8gZGVwcmVjYXRlR2xvYmFsKFwibWFpbkNvcmVcIiwgdGhpcy5tYWluQ29yZSk7XHJcbiAgICAgICAgQ29yZS5pbml0KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIGZ1bmN0aW9uIHBhdGNoTW9kdWxlTG9hZCgpIHtcclxuLy8gICAgIGNvbnN0IG5hbWVzcGFjZSA9IFwiYmV0dGVyZGlzY29yZFwiO1xyXG4vLyAgICAgY29uc3QgcHJlZml4ID0gYCR7bmFtZXNwYWNlfS9gO1xyXG4vLyAgICAgY29uc3QgTW9kdWxlID0gcmVxdWlyZShcIm1vZHVsZVwiKTtcclxuLy8gICAgIGNvbnN0IGxvYWQgPSBNb2R1bGUuX2xvYWQ7XHJcbi8vICAgICAvLyBjb25zdCByZXNvbHZlRmlsZW5hbWUgPSBNb2R1bGUuX3Jlc29sdmVGaWxlbmFtZTtcclxuXHJcbi8vICAgICBNb2R1bGUuX2xvYWQgPSBmdW5jdGlvbihyZXF1ZXN0KSB7XHJcbi8vICAgICAgICAgaWYgKHJlcXVlc3QgPT09IG5hbWVzcGFjZSB8fCByZXF1ZXN0LnN0YXJ0c1dpdGgocHJlZml4KSkge1xyXG4vLyAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWQgPSByZXF1ZXN0LnN1YnN0cihwcmVmaXgubGVuZ3RoKTtcclxuLy8gICAgICAgICAgICAgaWYgKHJlcXVlc3RlZCA9PSBcImFwaVwiKSByZXR1cm4gQmRBcGk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICByZXR1cm4gbG9hZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4vLyAgICAgfTtcclxuXHJcbi8vICAgICAvLyBNb2R1bGUuX3Jlc29sdmVGaWxlbmFtZSA9IGZ1bmN0aW9uIChyZXF1ZXN0LCBwYXJlbnQsIGlzTWFpbikge1xyXG4vLyAgICAgLy8gICAgIGlmIChyZXF1ZXN0ID09PSBcImJldHRlcmRpc2NvcmRcIiB8fCByZXF1ZXN0LnN0YXJ0c1dpdGgoXCJiZXR0ZXJkaXNjb3JkL1wiKSkge1xyXG4vLyAgICAgLy8gICAgICAgICBjb25zdCBjb250ZW50UGF0aCA9IFBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luUGF0aEJ5TW9kdWxlKHBhcmVudCk7XHJcbi8vICAgICAvLyAgICAgICAgIGlmIChjb250ZW50UGF0aCkgcmV0dXJuIHJlcXVlc3Q7XHJcbi8vICAgICAvLyAgICAgfVxyXG5cclxuLy8gICAgIC8vICAgICByZXR1cm4gcmVzb2x2ZUZpbGVuYW1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbi8vICAgICAvLyB9O1xyXG5cclxuLy8gICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuLy8gICAgICAgICBNb2R1bGUuX2xvYWQgPSBsb2FkO1xyXG4vLyAgICAgfTtcclxuLy8gfVxyXG5cclxuLy8gcGF0Y2hNb2R1bGVMb2FkKCk7XHJcblxyXG4vLyB2YXIgc2V0dGluZ3NQYW5lbCwgdm9pY2VNb2RlLCwgZE1vZGUsIHB1YmxpY1NlcnZlcnNNb2R1bGU7XHJcbi8vIHZhciBiZENvbmZpZyA9IG51bGw7XHJcblxyXG5yZXF1aXJlKFwicmVxdWVzdFwiKS8vIGp1c3QgaW4gY2FjaGUgc28gcGx1Z2luIGNhbiByZXF1aXJlIGl0IHRvbyIsImV4cG9ydCBkZWZhdWx0ICgpID0+IHtcclxuICAgIGNvbnN0IHYyTG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIHYyTG9hZGVyLmNsYXNzTmFtZSA9IFwiYmQtbG9hZGVydjJcIjtcclxuICAgIHYyTG9hZGVyLnRpdGxlID0gXCJCYW5kYWdlZEJEIGlzIGxvYWRpbmcuLi5cIjtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodjJMb2FkZXIpO1xyXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgY29udGVudFdpbmRvd0dldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBcImNvbnRlbnRXaW5kb3dcIikuZ2V0O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudFdpbmRvdyA9IFJlZmxlY3QuYXBwbHkoY29udGVudFdpbmRvd0dldHRlciwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb250ZW50V2luZG93LCB7XHJcbiAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImxvY2FsU3RvcmFnZVwiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gb2JqW3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB2YWwuYmluZChvYmopO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFByZXZlbnQgaW50ZXJjZXB0aW9uIGJ5IHBhdGNoaW5nIFJlZmxlY3QuYXBwbHkgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVmbGVjdCwgXCJhcHBseVwiLCB7dmFsdWU6IFJlZmxlY3QuYXBwbHksIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZX0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgXCJiaW5kXCIsIHt2YWx1ZTogRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIHdyaXRhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiBmYWxzZX0pO1xyXG5cclxuICAgIGNvbnN0IG9PcGVuID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47XHJcbiAgICBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICBpZiAodXJsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJhcGkvd2ViaG9va3NcIikpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KG9PcGVuLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBURkhvdXIge1xyXG4gICAgaW5qZWN0MjRIb3VyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbDI0SG91cikgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCB0d2VsdmVIb3VyID0gbmV3IFJlZ0V4cChgKFswLTldezEsMn0pOihbMC05XXsxLDJ9KVxcXFxzKEFNfFBNKWApO1xyXG4gICAgICAgIGNvbnN0IGNvbnZlcnQgPSAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTZcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGRhdGEucmV0dXJuVmFsdWUubWF0Y2godHdlbHZlSG91cik7XHJcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZCB8fCBtYXRjaGVkLmxlbmd0aCAhPT0gNCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2hlZFszXSA9PT0gXCJBTVwiKSByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWUucmVwbGFjZShtYXRjaGVkWzBdLCBgJHttYXRjaGVkWzFdID09PSBcIjEyXCIgPyBcIjAwXCIgOiBtYXRjaGVkWzFdLnBhZFN0YXJ0KDIsIFwiMFwiKX06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWUucmVwbGFjZShtYXRjaGVkWzBdLCBgJHttYXRjaGVkWzFdID09PSBcIjEyXCIgPyBcIjEyXCIgOiBwYXJzZUludChtYXRjaGVkWzFdKSArIDEyfToke21hdGNoZWRbMl19YCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FuY2VsQ296eSA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJjYWxlbmRhckZvcm1hdFwiLCB7YWZ0ZXI6IGNvbnZlcnR9KTsgLy8gQ2FsbGVkIGluIENvenkgbW9kZVxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvbXBhY3QgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiZGF0ZUZvcm1hdFwiLCB7YWZ0ZXI6IGNvbnZlcnR9KTsgLy8gQ2FsbGVkIGluIENvbXBhY3QgbW9kZVxyXG4gICAgICAgIHRoaXMuY2FuY2VsMjRIb3VyID0gKCkgPT4ge2NhbmNlbENvenkoKTsgY2FuY2VsQ29tcGFjdCgpO307IC8vIENhbmNlbCBib3RoXHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlMjRIb3VyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbDI0SG91cikgdGhpcy5jYW5jZWwyNEhvdXIoKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuY29uc3QgZGlzcGF0Y2hlciA9IHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlclxyXG5jb25zdCBDaGFubmVsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q2hhbm5lbCAmJiBlLmRlZmF1bHQuaGFzQ2hhbm5lbClbMF0uZGVmYXVsdFxyXG5sZXQgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG5sZXQgRE1Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKVswXVxyXG5cclxuY29uc3QgYmxvY2tlZCA9IHt9XHJcblxyXG5sZXQgdXNlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXVxyXG5mdW5jdGlvbiBnZXRDdXJyZW50VXNlcigpe1xyXG4gICAgaWYodXNlck1vZHVsZSlyZXR1cm4gdXNlck1vZHVsZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgIHJldHVybiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBBbnRpQm90RE0ge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmFudGlETSA9IHRoaXMuYW50aURNLmJpbmQodGhpcylcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpe1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuXHJcbiAgICAgICAgZGlzcGF0Y2hlci51bnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGFudGlETShldil7XHJcbiAgICAgICAgaWYoIWV2Lm1lc3NhZ2UuYXV0aG9yLmJvdClyZXR1cm5cclxuICAgICAgICBpZihldi5tZXNzYWdlLmF1dGhvci5pZCA9PT0gZ2V0Q3VycmVudFVzZXIoKS5pZClcclxuICAgICAgICBpZihldi5tZXNzYWdlLmd1aWxkX2lkKXJldHVyblxyXG5cclxuICAgICAgICBjb25zdCBjaGFubmVsID0gQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsKGV2Lm1lc3NhZ2UuY2hhbm5lbF9pZClcclxuICAgICAgICBpZighY2hhbm5lbClyZXR1cm4gLy8gbWlnaHQgYmUgYnJva2VuXHJcblxyXG4gICAgICAgIGlmKGNoYW5uZWwudHlwZSAhPT0gMSlyZXR1cm5cclxuXHJcbiAgICAgICAgaWYoYmxvY2tlZFtldi5tZXNzYWdlLmF1dGhvci5pZF0pcmV0dXJuIC8vIElmIHRoZSB1c2VyIHVuYmxvY2sgdGhlIGJvdCwgRG9uJ3QgYmxvY2sgaXQgYWdhaW4uXHJcblxyXG4gICAgICAgIGlmKHNjYW5NZXNzYWdlKGV2Lm1lc3NhZ2UpKXtcclxuICAgICAgICAgICAgYmxvY2tlZFtldi5tZXNzYWdlLmF1dGhvci5pZF0gPSB0cnVlXHJcbiAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChgW0FkQmxvY2tdOiBCbG9ja2VkICR7ZXYubWVzc2FnZS5hdXRob3IudXNlcm5hbWV9IyR7ZXYubWVzc2FnZS5hdXRob3IuZGlzY3JpbWluYXRvcn1gLCB7XHJcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJ3YXJuaW5nXCJcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYoIXJlbGF0aW9uU2hpcE1vZHVsZSlyZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXHJcbiAgICAgICAgICAgIHJlbGF0aW9uU2hpcE1vZHVsZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcChldi5tZXNzYWdlLmF1dGhvci5pZCwge1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb246IFwiQ29udGV4dE1lbnVcIlxyXG4gICAgICAgICAgICB9LCAyKVxyXG4gICAgICAgICAgICBpZighRE1Nb2R1bGUpRE1Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKVswXVxyXG4gICAgICAgICAgICBETU1vZHVsZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwoY2hhbm5lbC5pZCwgZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzY2FuTWVzc2FnZShtZXNzYWdlKXtcclxuICAgIGlmKC8oZGlzY29yZFxcLmdnfGRpc2NvcmRcXC5jb21cXC9pbnZpdGVcXC98ZGlzY29yZGFwcFxcLmNvbVxcL2ludml0ZVxcLykvZy50ZXN0KG1lc3NhZ2UuY29udGVudCkpcmV0dXJuIHRydWVcclxuICAgIGlmKEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5nZy9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmNvbS9pbnZpdGUvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZGFwcC5jb20vaW52aXRlL1wiKSlyZXR1cm4gdHJ1ZVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG59XHJcbmZ1bmN0aW9uIEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIHNlYXJjaCl7XHJcbiAgICBsZXQgZW1iZWRzID0gbWVzc2FnZS5lbWJlZHNcclxuICAgIGlmKGVtYmVkcy5sZW5ndGggPT09IDApcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gZW1iZWRzLm1hcChlbWJlZCA9PiB7XHJcbiAgICAgICAgaWYoZW1iZWQudHlwZSAhPT0gXCJyaWNoXCIpcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYoKGVtYmVkLnRpdGxlIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoZW1iZWQuZGVzY3JpcHRpb24gfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKCgoZW1iZWQuZm9vdGVyIHx8IFwiXCIpICYmIGVtYmVkLmZvb3Rlci50ZXh0IHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZihlbWJlZC5maWVsZHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXHJcbiAgICAgICAgfSkuaW5jbHVkZXModHJ1ZSkpcmV0dXJuIHRydWVcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICB9KS5pbmNsdWRlcyh0cnVlKVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uRGlzcGF0Y2hlciYmbS5kZWZhdWx0JiZtLmRlZmF1bHQuZGlzcGF0Y2gpWzBdLmRlZmF1bHRcclxuY29uc3QgQWN0aW9uVHlwZXMgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uQWN0aW9uVHlwZXMpWzBdLkFjdGlvblR5cGVzXHJcblxyXG5jb25zdCBzb2NrZXRJZCA9IFwibGlnaHRjb3JkLXNwb29mLXNvY2tldFwiXHJcbmNvbnN0IHBpZCA9IHByb2Nlc3MucGlkXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ3VzdG9tUmljaFByZXNlbmNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gc2V0dGluZ3NSUENcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGZvcm1hdGVkR2FtZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQgPT09IGZhbHNlKXJldHVybiBudWxsXHJcbiAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgfVxyXG5cclxuICAgIHNlbmRHYW1lKCl7XHJcbiAgICAgICAgZGlzcGF0Y2hlci5kaXNwYXRjaCh7XHJcbiAgICAgICAgICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQ0FMX0FDVElWSVRZX1VQREFURSxcclxuICAgICAgICAgICAgc29ja2V0SWQsXHJcbiAgICAgICAgICAgIHBpZCxcclxuICAgICAgICAgICAgYWN0aXZpdHk6IHRoaXMuZm9ybWF0ZWRHYW1lXHJcbiAgICAgICAgfSkgICBcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKSB7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkVuYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZXQoc2V0dGluZ3NSUEMgfHwgT2JqZWN0LmNyZWF0ZShkZWZhdWx0UlBDKSlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpIHtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEaXNhYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmZXRjaEFzc2V0cyhhcHBsaWNhdGlvbklkKXtcclxuICAgICAgICBsZXQgYXNzZXRzID0gYXdhaXQgQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXNzZXRzKVswXS5nZXRBc3NldHMoYXBwbGljYXRpb25JZClcclxuICAgICAgICBpZihhc3NldHMudW5kZWZpbmVkICYmIHR5cGVvZiBhc3NldHMudW5kZWZpbmVkID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBBcHBsaWNhdGlvblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXNzZXRzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGFjdGl2aXR5KXtcclxuICAgICAgICB0aGlzLmdhbWUgPSBhY3Rpdml0eVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxufSIsImltcG9ydCB7cGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IG1haW5Db3JlIGZyb20gXCIuL2NvcmVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IEJkQXBpID0ge1xyXG4gICAgZ2V0IFJlYWN0KCkgeyByZXR1cm4gQkRWMi5SZWFjdDsgfSxcclxuICAgIGdldCBSZWFjdERPTSgpIHsgcmV0dXJuIEJEVjIuUmVhY3REb207IH0sXHJcbiAgICBnZXQgUmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIEJEVjIuUmVhY3RDb21wb25lbnQ7fSxcclxuICAgIGdldCBXaW5kb3dDb25maWdGaWxlKCkge3JldHVybiBVdGlscy5XaW5kb3dDb25maWdGaWxlO30sXHJcbiAgICBnZXQgc2V0dGluZ3MoKSB7cmV0dXJuIHNldHRpbmdzO30sXHJcbiAgICBnZXQgZW1vdGVzKCkge3JldHVybiB7fX0sIC8vIGRlcHJlY2F0ZWQsIGRlbGV0ZWQgYWxsIGVtb3RlcyBmcm9tIGJldHRlcmRpc2NvcmQuXHJcbiAgICBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9LFxyXG4gICAgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG59O1xyXG5cclxuQmRBcGkuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KTtcclxufTtcclxuXHJcbkJkQXBpLnNldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5pbmplY3RDU1MgPSBmdW5jdGlvbiAoaWQsIGNzcykge1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRChpZCksIGNzcyk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkuY2xlYXJDU1MgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5saW5rSlMgPSBmdW5jdGlvbiAoaWQsIHVybCkge1xyXG4gICAgRE9NLmFkZFNjcmlwdChET00uZXNjYXBlSUQoaWQpLCB1cmwpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLnVubGlua0pTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU2NyaXB0KERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9HZXQgYW5vdGhlciBwbHVnaW5cclxuLy9uYW1lID0gbmFtZSBvZiBwbHVnaW5cclxuQmRBcGkuZ2V0UGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIGlmIChiZHBsdWdpbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gYmRwbHVnaW5zW25hbWVdLnBsdWdpbjtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuLy9HZXQgQmV0dGVyRGlzY29yZCBDb3JlXHJcbkJkQXBpLmdldENvcmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRpb24gTm90aWNlXCIsIGBCZEFwaS5nZXRDb3JlKCkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5gKTtcclxuICAgIHJldHVybiBtYWluQ29yZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIG1vZGFsLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBhIHN0cmluZyBvZiB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5hbGVydCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwge2NhbmNlbFRleHQ6IG51bGx9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxyXG4gKi9cclxuQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy9TaG93IHRvYXN0IGFsZXJ0XHJcbkJkQXBpLnNob3dUb2FzdCA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgVXRpbHMuc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGUgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kQWxsTW9kdWxlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEFsbChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3BzID0gZnVuY3Rpb24oLi4ucHJvcHMpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMocHJvcHMpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvdG90eXBlcyA9IGZ1bmN0aW9uKC4uLnByb3Rvcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5UHJvdG90eXBlcyhwcm90b3MpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShuYW1lKTtcclxufTtcclxuXHJcbi8vIEdldHMgcmVhY3QgaW5zdGFuY2VcclxuQmRBcGkuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cualF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSBub2RlID0gbm9kZVswXTtcclxuICAgIHJldHVybiBCRFYyLmdldEludGVybmFsSW5zdGFuY2Uobm9kZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkubG9hZERhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0RGF0YSA9IEJkQXBpLmxvYWREYXRhO1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNhdmVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCBkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLnNldERhdGEgPSBCZEFwaS5zYXZlRGF0YTtcclxuXHJcbi8vIERlbGV0ZXMgZGF0YVxyXG5CZEFwaS5kZWxldGVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbi8vIFBhdGNoZXMgb3RoZXIgZnVuY3Rpb25zXHJcbkJkQXBpLm1vbmtleVBhdGNoID0gZnVuY3Rpb24od2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRXZlbnQgd2hlbiBlbGVtZW50IGlzIHJlbW92ZWRcclxuQmRBcGkub25SZW1vdmVkID0gZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBVdGlscy5vblJlbW92ZWQobm9kZSwgY2FsbGJhY2spO1xyXG59O1xyXG5cclxuLy8gV3JhcHMgZnVuY3Rpb24gaW4gdHJ5Li5jYXRjaFxyXG5CZEFwaS5zdXBwcmVzc0Vycm9ycyA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSk7XHJcbn07XHJcblxyXG4vLyBUZXN0cyBmb3IgdmFsaWQgSlNPTlxyXG5CZEFwaS50ZXN0SlNPTiA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgIHJldHVybiBVdGlscy50ZXN0SlNPTihkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLmlzUGx1Z2luRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXBsdWdpbkNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzVGhlbWVFbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhdGhlbWVDb29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1NldHRpbmdFbmFibGVkID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiAhIXNldHRpbmdzQ29va2llW2lkXTtcclxufTtcclxuXHJcbkJkQXBpLmVuYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIHRydWUpO1xyXG59O1xyXG5cclxuQmRBcGkuZGlzYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIGZhbHNlKTtcclxufTtcclxuXHJcbkJkQXBpLnRvZ2dsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsICFzZXR0aW5nc0Nvb2tpZVtpZF0pO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmdldEJERGF0YSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRCRERhdGEoa2V5KTtcclxufTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zZXRCRERhdGEgPSBmdW5jdGlvbihrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0QkREYXRhKGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5cclxuXHJcbmNvbnN0IG1ha2VBZGRvbkFQSSA9IChjb29raWUsIGxpc3QsIG1hbmFnZXIpID0+IG5ldyBjbGFzcyBBZGRvbkFQSSB7XHJcblxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gbWFuYWdlci5mb2xkZXI7fVxyXG5cclxuICAgIGlzRW5hYmxlZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhY29va2llW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmRpc2FibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKG5hbWUpIHtcclxuICAgICAgICBpZiAoY29va2llW25hbWVdKSB0aGlzLmRpc2FibGUobmFtZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLnJlbG9hZChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQobmFtZSkge1xyXG4gICAgICAgIGlmIChsaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0W25hbWVdLnBsdWdpbikgcmV0dXJuIGxpc3RbbmFtZV0ucGx1Z2luO1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdFtuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoayA9PiB0aGlzLmdldChrKSkuZmlsdGVyKGEgPT4gYSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5CZEFwaS5QbHVnaW5zID0gbWFrZUFkZG9uQVBJKHBsdWdpbkNvb2tpZSwgYmRwbHVnaW5zLCBwbHVnaW5Nb2R1bGUpO1xyXG5CZEFwaS5UaGVtZXMgPSBtYWtlQWRkb25BUEkodGhlbWVDb29raWUsIGJkdGhlbWVzLCB0aGVtZU1vZHVsZSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCZEFwaTsiLCIvKiBCREV2ZW50cyAqL1xyXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXS51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzWzBdfSwgJHtzZWxlY3RvcnNbMV19LCAke3NlbGVjdG9yc1syXX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzWzBdfTpob3ZlciwgJHtzZWxlY3RvcnNbMV19OmhvdmVyLCAke3NlbGVjdG9yc1syXX06aG92ZXIge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLnJldmVydEVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGVzKFdlYnBhY2tNb2R1bGVzLmZpbmRBbGwodGhpcy5tb2R1bGVGaWx0ZXIuYmluZCh0aGlzKSkpO1xyXG4gICAgICAgIHRoaXMubm9ybWFsaXplRWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XHJcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhdGNoRE9NTWV0aG9kcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZElnbm9yZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuZW5kc1dpdGgoXCJweFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImNoXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiZW1cIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJtc1wiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJsYXllckNvbnRhaW5lci1cIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSAmJiAodmFsdWUubGVuZ3RoID09IDcgfHwgdmFsdWUubGVuZ3RoID09IDQpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoXCJjYWxjKFwiKSB8fCB2YWx1ZS5pbmNsdWRlcyhcInJnYmFcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBtb2R1bGVGaWx0ZXIobW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtb2R1bGUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG1vZHVsZS5fX2VzTW9kdWxlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhtb2R1bGUpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBtb2R1bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2R1bGVbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChcIi1cIikubGVuZ3RoID09PSAxKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QodmFsdWUuc3BsaXQoXCIgXCIpWzBdKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBub3JtYWxDbGFzcy5tYXRjaChyYW5kQ2xhc3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gubGVuZ3RoIHx8IG1hdGNoLmxlbmd0aCA8IDIpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgZXZlciBoYXBwZW4gc2luY2UgdGhleSBwYXNzZWQgdGhlIG1vZHVsZUZpbHRlciwgYnV0IHlvdSBuZXZlciBrbm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYW1lbENhc2UgPSBtYXRjaFsxXS5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdICs9IGAgJHtjb21wb25lbnROYW1lfS0ke2NhbWVsQ2FzZX1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVucGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgbGV0IG5ld1N0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxDbGFzcy5zdGFydHNXaXRoKGAke2NvbXBvbmVudE5hbWV9LWApKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIG5ld1N0cmluZyArPSBgICR7bm9ybWFsQ2xhc3N9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdID0gbmV3U3RyaW5nLnRyaW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gY2xhc3Nlcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdChjbGFzc2VzW2NdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY2xhc3Nlc1tjXS5tYXRjaChyYW5kQ2xhc3MpWzFdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDbGFzcyA9IG1hdGNoLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGAke25vcm1hbGl6ZWRQcmVmaXh9LSR7bmV3Q2xhc3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikgdGhpcy5ub3JtYWxpemVFbGVtZW50KGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnRFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcclxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQuY2hpbGRyZW5bMF0pO1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKGNsYXNzZXNbY10uc3RhcnRzV2l0aChgJHtub3JtYWxpemVkUHJlZml4fS1gKSkgdG9SZW1vdmUucHVzaChjbGFzc2VzW2NdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRvUmVtb3ZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaERPTU1ldGhvZHMoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbnMgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih0b2tlbikge1xyXG4gICAgICAgICAgICAvLyBjb25zdCB0b2tlbnMgPSB0b2tlbi5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGNvbnRhaW5zLCB0aGlzLCBbdG9rZW4uc3BsaXQoXCIgXCIpWzBdXSk7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0b2tlbnMuZXZlcnkodCA9PiBjb250YWlucy5jYWxsKHRoaXMsIHQpKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDtcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zW3RdID0gdG9rZW5zW3RdLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShhZGQsIHRoaXMsIHRva2Vucyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocmVtb3ZlLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb2xvcmVkVGV4dCB7XHJcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWxDb2xvcmVkVGV4dCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2FuY2VsQ29sb3JlZFRleHQgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50ID0gcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUeXBlID0gbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxUeXBlLl9fb3JpZ2luYWxNZXRob2QpIHJldHVybjsgLy8gRG9uJ3QgcGF0Y2ggYWdhaW5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxUeXBlKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVDb2xvciA9IHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0gPyBwcm9wcy5tZXNzYWdlLmNvbG9yU3RyaW5nIHx8IFwiXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsVHlwZTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlQ29udGVudC50eXBlLnR5cGUsIG9yaWdpbmFsVHlwZSk7XHJcbiAgICAgICAgfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWVNYXJrdXAgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdLm1hcmt1cFxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIrY2xhc3NOYW1lTWFya3VwLnNwbGl0KFwiIFwiKVswXSkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fID0gd2luZG93LnJlcXVpcmVcclxuaW1wb3J0IHtiZENvbmZpZywgYmRwbHVnaW5zLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIikuTW9kdWxlO1xyXG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUocmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHAuZ2V0QXBwUGF0aCgpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XHJcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xyXG5jb25zdCBvcmlnaW5hbENTU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID8gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA6ICgpID0+IHtyZXR1cm4gbnVsbDt9O1xyXG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xyXG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInRoZW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwbHVnaW5zRm9sZGVyKCkge3JldHVybiB0aGlzLl9wbHVnaW5zRm9sZGVyIHx8ICh0aGlzLl9wbHVnaW5zRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwicGx1Z2lucy9cIikpKTt9XHJcbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XHJcblxyXG4gICAgd2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSBjb250ZW50VHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdID0gZnMud2F0Y2goYmFzZUZvbGRlciwge3BlcnNpc3RlbnQ6IGZhbHNlfSwgYXN5bmMgKGV2ZW50VHlwZSwgZmlsZW5hbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudFR5cGUgfHwgIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgdHJ5IHtmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgcmV0dXJuIHBsdWdpbk1vZHVsZS51bmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpLmlzRmlsZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLm10aW1lIHx8ICFzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihzdGF0cy5tdGltZS5nZXRUaW1lKCkpICE9PSBcIm51bWJlclwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9IHN0YXRzLm10aW1lLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcInJlbmFtZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLnJlbG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLnJlbG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVud2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XHJcbiAgICAgICAgaWYgKGhhc09sZE1ldGEpIHJldHVybiB0aGlzLnBhcnNlT2xkTWV0YShjb250ZW50KTtcclxuICAgICAgICBjb25zdCBoYXNOZXdNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLyoqXCIpO1xyXG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VPbGRNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBtZXRhID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xyXG4gICAgICAgIGlmIChtZXRhLmluZGV4T2YoXCJNRVRBXCIpIDwgMCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbHMudGVzdEpTT04ocmF3TWV0YSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xyXG4gICAgICAgIGlmICghcGFyc2VkLm5hbWUpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIG1pc3NpbmcgbmFtZSBkYXRhLlwiKTtcclxuICAgICAgICBwYXJzZWQuZm9ybWF0ID0gXCJqc29uXCI7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5zcGxpdChcIi8qKlwiLCAyKVsxXS5zcGxpdChcIiovXCIsIDEpWzBdO1xyXG4gICAgICAgIGNvbnN0IG91dCA9IHt9O1xyXG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGFjY3VtID0gXCJcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2suc3BsaXQoc3BsaXRSZWdleCkpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09PSBcIkBcIiAmJiBsaW5lLmNoYXJBdCgxKSAhPT0gXCIgXCIpIHtcclxuICAgICAgICAgICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xyXG4gICAgICAgICAgICAgICAgZmllbGQgPSBsaW5lLnN1YnN0cigxLCBsIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSA9IGxpbmUuc3Vic3RyKGwgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtICs9IFwiIFwiICsgbGluZS5yZXBsYWNlKFwiXFxcXG5cIiwgXCJcXG5cIikucmVwbGFjZShlc2NhcGVkQXRSZWdleCwgXCJAXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bS50cmltKCk7XHJcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcclxuICAgICAgICBvdXQuZm9ybWF0ID0gXCJqc2RvY1wiO1xyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudFJlcXVpcmUodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBpc1BsdWdpbiA/IG9yaWdpbmFsSlNSZXF1aXJlIDogb3JpZ2luYWxDU1NSZXF1aXJlO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHNlbGYucGx1Z2luc0ZvbGRlciA6IHNlbGYudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZVBhdGggPSBwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgcGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIFwidXRmOFwiKTtcclxuICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLnN0cmlwQk9NKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzZWxmLmV4dHJhY3RNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIG1ldGEuYWRkZWQgPSBzdGF0cy5hdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLm1vZGlmaWVkID0gc3RhdHMubXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcclxuICAgICAgICAgICAgaWYgKCFpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5jc3MgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYG1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBtb2R1bGUuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkRXhwb3J0ID0gIVV0aWxzLmlzRW1wdHkobW9kdWxlLmV4cG9ydHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGEudHlwZSA9IG1vZHVsZS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbWV0YTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgXFxubW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtcXG5tb2R1bGUuZXhwb3J0cy50eXBlID0gJHttZXRhLmV4cG9ydHMgfHwgbWV0YS5uYW1lfTtgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBmaWxlbmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlUGxhY2Vob2xkZXJQbHVnaW4oZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICBnZXROYW1lOiAoKSA9PiB7cmV0dXJuIGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lO30sXHJcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb246ICgpID0+IHtyZXR1cm4gZGF0YS5tZXNzYWdlID8gZGF0YS5tZXNzYWdlIDogXCJUaGlzIHBsdWdpbiB3YXMgdW5hYmxlIHRvIGJlIGxvYWRlZC4gQ2hlY2sgdGhlIGF1dGhvcidzIHBhZ2UgZm9yIHVwZGF0ZXMuXCI7fSxcclxuICAgICAgICAgICAgICAgIGdldFZlcnNpb246ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBmaWxlbmFtZTogZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcclxuICAgICAgICAgICAgd2Vic2l0ZTogZGF0YS53ZWJzaXRlID8gZGF0YS53ZWJzaXRlIDogXCJcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHtfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbXBpbGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gX19ub25fd2VicGFja19yZXF1aXJlX18ocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IHttZXNzYWdlOiBcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIiwgc3RhY2s6IFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwifX1cclxuICAgICAgICBjb250ZW50LmlkID0gVXRpbHMuZXNjYXBlSUQoY29udGVudC5uYW1lKTtcclxuICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgaWYgKCFjb250ZW50LnR5cGUpIHJldHVybjtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucGx1Z2luID0gbmV3IGNvbnRlbnQudHlwZSgpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldO1xyXG4gICAgICAgICAgICAgICAgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV0gPSBjb250ZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgYmR0aGVtZXNbY29udGVudC5uYW1lXTtcclxuICAgICAgICAgICAgYmR0aGVtZXNbY29udGVudC5uYW1lXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVsZXRlIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fLmNhY2hlW19fbm9uX3dlYnBhY2tfcmVxdWlyZV9fLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIHVubG9hZGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX07fVxyXG4gICAgfVxyXG5cclxuICAgIGlzTG9hZGVkKGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7X19ub25fd2VicGFja19yZXF1aXJlX18uY2FjaGVbX19ub25fd2VicGFja19yZXF1aXJlX18ucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07fVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4gZmFsc2U7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBjYW50VW5sb2FkID0gdGhpcy51bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICBpZiAoY2FudFVubG9hZCkgcmV0dXJuIGNhbnRVbmxvYWQ7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWROZXdDb250ZW50KHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRMaXN0ID0gT2JqZWN0LnZhbHVlcyhpc1BsdWdpbiA/IGJkcGx1Z2lucyA6IGJkdGhlbWVzKTtcclxuICAgICAgICBjb25zdCByZW1vdmVkID0gY29udGVudExpc3QuZmlsdGVyKHQgPT4gIWZpbGVzLmluY2x1ZGVzKHQuZmlsZW5hbWUpKS5tYXAoYyA9PiBpc1BsdWdpbiA/IGMucGx1Z2luLmdldE5hbWUoKSA6IGMubmFtZSk7XHJcbiAgICAgICAgY29uc3QgYWRkZWQgPSBmaWxlcy5maWx0ZXIoZiA9PiAhY29udGVudExpc3QuZmluZCh0ID0+IHQuZmlsZW5hbWUgPT0gZikgJiYgZi5lbmRzV2l0aChmaWxlRW5kaW5nKSAmJiBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZWRpciwgZikpLmlzRmlsZSgpKTtcclxuICAgICAgICByZXR1cm4ge2FkZGVkLCByZW1vdmVkfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQWxsQ29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGx1Z2lucygpIHtyZXR1cm4gdGhpcy5sb2FkQWxsQ29udGVudChcInBsdWdpblwiKTt9XHJcbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIG1pblN1cHBvcnRlZFZlcnNpb24sIGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbkVycm9ycywgYmR0aGVtZUVycm9ycywgYmJkQ2hhbmdlbG9nLCBkZWZhdWx0Q29va2llLCBjdXJyZW50RGlzY29yZFZlcnNpb24sIGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IEJETG9nbyBmcm9tIFwiLi4vdWkvYmRMb2dvXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9saWdodGNvcmRcIjtcclxuaW1wb3J0IFBsdWdpbkNlcnRpZmllciBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xyXG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxyXG5pbXBvcnQge3JlbW90ZSBhcyBlbGVjdHJvbn0gZnJvbSBcImVsZWN0cm9uXCJcclxuXHJcbmZ1bmN0aW9uIENvcmUoKSB7XHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhEYXRhU3RvcmUuY29uZmlnRmlsZSkpO1xyXG4gICAgLy8gdGhpcy5pbml0KCk7XHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnNldENvbmZpZyA9IGZ1bmN0aW9uKGNvbmZpZykge1xyXG4gICAgT2JqZWN0LmFzc2lnbihiZENvbmZpZywgY29uZmlnKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiZENvbmZpZy52ZXJzaW9uIDwgbWluU3VwcG9ydGVkVmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LkVEKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggRW5oYW5jZWREaXNjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYXRlc3RMb2NhbFZlcnNpb24gPSBiZENvbmZpZy51cGRhdGVyID8gYmRDb25maWcudXBkYXRlci5MYXRlc3RWZXJzaW9uIDogYmRDb25maWcubGF0ZXN0VmVyc2lvbjtcclxuICAgIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xyXG4gICAgICAgICAgICBjb25maXJtVGV4dDogXCJVcGRhdGUgTm93XCIsXHJcbiAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiTWF5YmUgTGF0ZXJcIixcclxuICAgICAgICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZhaWxlZCA9ICgpID0+IHtVdGlscy5hbGVydChcIkNvdWxkIE5vdCBVcGRhdGVcIiwgYFVuYWJsZSB0byB1cGRhdGUgYXV0b21hdGljYWxseSwgcGxlYXNlIGRvd25sb2FkIHRoZSBpbnN0YWxsZXIgYW5kIHJlaW5zdGFsbCBub3JtYWxseS48YnIgLz48YnIgLz48YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkRvd25sb2FkIEluc3RhbGxlcjwvYT5gKTt9O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWRVcGRhdGUgPSBhd2FpdCB0aGlzLnVwZGF0ZUluamVjdG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGUpIHJldHVybiBvblVwZGF0ZUZhaWxlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5yZWxhdW5jaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5leGl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgU2V0dGluZ3NcIik7XHJcbiAgICB0aGlzLmluaXRTZXR0aW5ncygpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY2hlY2tGb3JHdWlsZHMoKTtcclxuICAgIEJEVjIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlVwZGF0aW5nIFNldHRpbmdzXCIpO1xyXG4gICAgc2V0dGluZ3NQYW5lbC5pbml0aWFsaXplU2V0dGluZ3MoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBQbHVnaW5zXCIpO1xyXG4gICAgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW5zKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgVGhlbWVzXCIpO1xyXG4gICAgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lcygpO1xyXG5cclxuICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCBhdG9iKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSkpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiUmVtb3ZpbmcgTG9hZGluZyBJY29uXCIpO1xyXG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgTWFpbiBPYnNlcnZlclwiKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmVyKCk7XHJcblxyXG4gICAgLy8gU2hvdyBsb2FkaW5nIGVycm9yc1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XHJcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IGJkcGx1Z2luRXJyb3JzLCB0aGVtZXM6IGJkdGhlbWVFcnJvcnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwidmVyc2lvblwiKTtcclxuICAgIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XHJcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlbW9qaU1vZHVsZSA9IEVtb2ppTW9kdWxlXHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkTGlzdEl0ZW1zLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgTGlzdCBJdGVtcyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZW1iZXJMaXN0LmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgTWVtYmVyIExpc3QgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIGlmKGJkQ29uZmlnLmhhdmVJbnN0YWxsZWREZWZhdWx0KXtcclxuICAgICAgICBsZXQgYWxlcnQgPSBVdGlscy5hbGVydChcIkZpcnN0IEluc3RhbGxhdGlvblwiLCBcIkFzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBpbnN0YWxsIExpZ2h0Y29yZCwgV2UgYWRkZWQgdHdvIGRlZmF1bHQgdGhlbWVzIGFuZCBvbmUgZGVmYXVsdCBwbHVnaW4gaW4geW91ciBwbHVnaW4vdGhlbWUgZm9sZGVyLiBDaGVjayBpdCBpbiB0aGUgUGx1Z2luL1RoZW1lIHNldHRpbmdzLlwiKVxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGFsZXJ0Lm9uQ2xvc2UocmVzb2x2ZSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50ID4gZGl2LnR5cGVXaW5kb3dzLTF6YS1uNy53aXRoRnJhbWUtaGFZbHRJLnRpdGxlQmFyLUFDNHBHVi5ob3Jpem9udGFsUmV2ZXJzZS0zdFJqWTcuZmxleC0xTzFHS1kuZGlyZWN0aW9uUm93UmV2ZXJzZS1tOElqSXEuanVzdGlmeVN0YXJ0LTJOREZ6aS5hbGlnblN0cmV0Y2gtRHBHUGYzLmRhLXR5cGVXaW5kb3dzLmRhLXdpdGhGcmFtZS5kYS10aXRsZUJhci5kYS1ob3Jpem9udGFsUmV2ZXJzZS5kYS1mbGV4LmRhLWRpcmVjdGlvblJvd1JldmVyc2UuZGEtanVzdGlmeVN0YXJ0LmRhLWFsaWduU3RyZXRjaCA+IGRpdi53b3JkbWFya1dpbmRvd3MtMXYwbFlELndvcmRtYXJrLTJpRERmbS5kYS13b3JkbWFya1dpbmRvd3MuZGEtd29yZG1hcmtcIilcclxuICAgIGlmKGxvZ28pe1xyXG4gICAgICAgIGxvZ28uaW5uZXJIVE1MID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjEwXCIgd2lkdGg9XCI3MFwiIHZpZXdCb3g9XCIwIDAgNzIuNTQgMTBcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAtNXB4LCBtYXJnaW4tdG9wOiAxMHB4XCI+XHJcbiAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00NC44MSw5LjY3VjYuMzNjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MUEzLjUzLDMuNTMsMCwwLDAsNDYuMiwzYy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5LjY3YzAsMi4yMSwxLjg5LDMuMzMsMy43NywzLjMzYTMuODcsMy44NywwLDAsMCwzLjQ1LTIuMThsLTIuMTItMUM0NywxMS4xNyw0NC44MSwxMC44NSw0NC44MSw5LjY3Wk0xMC42OCwxMi44OWgyLjQxVjMuMTdIMTAuNjhaTTcxLjc2LDMuMTRINjguMTlWNy4yM0w3MC41Nyw5LjR2LTRoMS4yN2MuODEsMCwxLjIxLjQxLDEuMjEsMXYzYzAsLjYzLS4zOCwxLjA1LTEuMjEsMS4wNUg2OC4xOHYyLjMxaDMuNTdjMS45MiwwLDMuNzItMSwzLjcyLTMuMlY2LjM5Qzc1LjQ4LDQuMTMsNzMuNjgsMy4xNCw3MS43NiwzLjE0Wk01NC4yMiwzYy0yLDAtNCwxLjEtNCwzLjM0VjkuNjZjMCwyLjIzLDIsMy4zNCw0LDMuMzRzMy45NS0xLjExLDMuOTUtMy4zNFY2LjM0QzU4LjE5LDQuMTEsNTYuMiwzLDU0LjIyLDNabTEuNTUsNi42NmMwLC43LS43OCwxLjA2LTEuNTQsMS4wNnMtMS41NS0uMzUtMS41NS0xLjA2VjYuMzRjMC0uNzIuNzUtMS4xLDEuNS0xLjFzMS41OS4zNSwxLjU5LDEuMVpNNjYuODQsNi4zNGMwLTIuMjktMS41OC0zLjItMy41NS0zLjJINTkuNDZ2OS43M2gyLjQ1VjkuNzdoLjQzbDIuMjIsMy4wOWgzTDY1LDkuNTJDNjYuMTMsOS4xNSw2Ni44NCw4LjE0LDY2Ljg0LDYuMzRaTTYzLjMzLDcuNjVINjEuOTFWNS40M2gxLjQyQTEuMTEsMS4xMSwwLDEsMSw2My4zMyw3LjY1Wk0yOS44MywxM2gyLjQyVjMuMDZIMjkuODNWNi43M2wtMywwVjMuMDlIMjQuN3Y5Ljc4aDIuMTRWOC42OGwzLDBaTTE3LjE2LDkuNzZWNi40MmMwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxYTMuNTUsMy41NSwwLDAsMC0zLjM2LTIuMjRjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNzZjMCwyLjIxLDIsMy4xNSwzLjksMy4xNXMzLjU4LTEsMy41OC0zVjcuNThIMTguNzlsMCwxLjM2SDIwLjN2Ljc3QzIwLjMsMTAuOTIsMTcuMTYsMTAuOTQsMTcuMTYsOS43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuOTMgLTMpXCIvPlxyXG4gICAgPHBvbHlnb24gZmlsbD1cImN1cnJlbnRDb2xvclwiIHBvaW50cz1cIjM1LjkxIDAuMDYgMzguNDMgMC4wNiAzOC40MyAxLjg0IDM1LjkyIDEuODEgMzUuOTcgMTAgMzMuNTUgMTAgMzMuNDkgMS43NSAzMC45OCAxLjc0IDMwLjk4IDAuMDYgMzMuNDkgMC4wNiAzNS45MSAwLjA2XCIvPlxyXG4gICAgPHBvbHlnb24gZmlsbD1cImN1cnJlbnRDb2xvclwiIHBvaW50cz1cIjAgOS45NyA2LjUgMTAgNi41IDcuNjMgMi40MSA3LjYzIDIuNDEgMC4yNiAwIDIuMjYgMCA5Ljk3XCIvPlxyXG48L3N2Zz5gXHJcbiAgICB9XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5jaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHRpbWVzQ2hlY2tlZCA9IDA7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IEJEVjIuZ3VpbGRDbGFzc2VzLndyYXBwZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGQgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVzQ2hlY2tlZCA+PSA1MCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9IFwibG9hZGluZ1wiKSBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO30pO1xyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcclxuICAgIGlmICh3aW5kb3cucmVxdWlyZS5vcmlnaW5hbCkgd2luZG93LnJlcXVpcmUgPSB3aW5kb3cucmVxdWlyZS5vcmlnaW5hbDtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0T2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBtYWluT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5Nb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHBsdWdpbk1vZHVsZS5yYXdPYnNlcnZlcihtdXRhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgbm90aGluZyBhZGRlZCwgc2tpcFxyXG4gICAgICAgICAgICBpZiAoIW11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoIHx8ICEobXV0YXRpb24uYWRkZWROb2Rlc1swXSBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzWzBdO1xyXG5cclxuICAgICAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyLCBcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZVNvY2lhbExpbmtzXHJcbiAgICAgICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuYW5pbWF0aW5nKVswXS5sYXllcixcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc29jaWFsTGlua3MgJiYgdHlwZW9mIGUuc29jaWFsTGlua3MgPT09IFwic3RyaW5nXCIpWzBdLnNvY2lhbExpbmtzXHJcbiAgICAgICAgICAgIF1cclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJndWlsZC1zZXR0aW5ncy1iYXNlLXNlY3Rpb25cIikubGVuZ3RoKSBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwic2VydmVyLXNldHRpbmdzXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lU29jaWFsTGlua3MpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZC1zZXR0aW5ncy1zaWRlYmFyXCIpKSBzZXR0aW5nc1BhbmVsLnJlbmRlclNpZGViYXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50RWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ICYmIG5vZGUucXVlcnlTZWxlY3RvcihcIiNhY2Vfc2V0dGluZ3NtZW51XCIpKSBub2RlLmlkID0gXCJhY2Vfc2V0dGluZ3NtZW51X2NvbnRhaW5lclwiO1xyXG5cclxuICAgICAgICAgICAgLy8gRW1vamkgUGlja2VyXHJcbiAgICAgICAgICAgIC8vbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZW1vamlQaWNrZXItM20xUy1qXCIpLmxlbmd0aCAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLmVtb2ppUGlja2VyLTNtMVMtalwiKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFuaW1hdG9yTGVmdC0xRVF4VTBcIilcclxuICAgICAgICAgICAgLy9pZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIyKSAmJiBub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lRW1vamlQaWNrZXIpLmxlbmd0aCAgJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVFbW9qaVBpY2tlcikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lQW5pbWF0b3JMZWZ0KSkgcXVpY2tFbW90ZU1lbnUub2JzQ2FsbGJhY2sobm9kZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIG1haW5PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7XHJcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuYWxlcnQgPSBmdW5jdGlvbih0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgVGFiQmFyID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJUYWJCYXJcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghVGFiQmFyKSByZXR1cm47XHJcbiAgICB0aGlzLnNvY2lhbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goVGFiQmFyLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlbjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAzXS50eXBlLmRpc3BsYXlOYW1lICE9PSBcIlNlcGFyYXRvclwiKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJzb2NpYWxMaW5rc1wiKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChBbmNob3IpIHtcclxuICAgICAgICAgICAgbGV0IHNvY2lhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zb2NpYWxMaW5rcylbMF1cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIitzb2NpYWxNb2R1bGUxLmxpbmssIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVDb2xvck11dGVkLFxyXG4gICAgICAgICAgICBzaXplcyxcclxuICAgICAgICAgICAgY2xhc3NOYW1lVmVyc2lvbkhhc2hcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJzaW9uSGFzaClbMF0udmVyc2lvbkhhc2hcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIGNvbnN0IHZlcnNpb25IYXNoID0gYCgke2JkQ29uZmlnLmhhc2ggPyBiZENvbmZpZy5oYXNoLnN1YnN0cmluZygwLCA3KSA6IGJkQ29uZmlnLmJyYW5jaH0pYDtcclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBMaWdodGNvcmQgJHtlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikudmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWVWZXJzaW9uSGFzaCtcIiBkYS12ZXJzaW9uSGFzaFwifSwgYCgkeyhlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikuY29tbWl0IHx8IFwiVW5rbm93blwiKS5zbGljZSgwLCA3KX0pYCkpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBCQkQgJHtiYmRWZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCB2ZXJzaW9uSGFzaCkpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcclxuICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsVmVyc2lvbnMoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICB9O1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBndWlsZHNXcmFwcGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ3cmFwcGVyXCIsIFwidW5yZWFkTWVudGlvbnNCYXJcIik7XHJcbiAgICBjb25zdCBndWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImd1aWxkc0Vycm9yXCIsIFwic2VsZWN0ZWRcIik7XHJcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkTGlzdEl0ZW1zID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcclxuICAgIGNvbnN0IGxpc3RJdGVtQ2xhc3MgPSBHdWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgYmxvYkNsYXNzID0gR3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XHJcbiAgICBjb25zdCBHdWlsZENvbXBvbmVudCA9IHJlYWN0SW5zdGFuY2UucmV0dXJuLnR5cGU7XHJcbiAgICBpZiAoIUd1aWxkQ29tcG9uZW50KSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5yZXR1cm5WYWx1ZSAmJiBkYXRhLnRoaXNPYmplY3QpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XHJcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnVucmVhZCkgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXVucmVhZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnNlbGVjdGVkKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5hdWRpbykgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWF1ZGlvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudmlkZW8pIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC12aWRlb1wiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmJhZGdlKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtYmFkZ2VcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5hbmltYXRhYmxlKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtYW5pbWF0YWJsZVwiO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFBpbGxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgZ3VpbGRQaWxsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiAhbS5kZWZhdWx0LmRpc3BsYXlOYW1lICYmIG0uZGVmYXVsdC50b1N0cmluZyAmJiBtLmRlZmF1bHQudG9TdHJpbmcoKS5pbmNsdWRlcyhcInRyYW5zbGF0ZTNkXCIpKTtcclxuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkUGlsbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goZ3VpbGRQaWxsLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XHJcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLnNlbGVjdGVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgIGlmIChwcm9wcy5ob3ZlcmVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ob3ZlcmVkXCI7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgIGNvbnN0IGd1aWxkQ29tcG9uZW50cyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicmVuZGVyTGlzdEl0ZW1cIik7XHJcbiAgICBpZiAoIWd1aWxkQ29tcG9uZW50cyB8fCAhR3VpbGRzKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gZ3VpbGRDb21wb25lbnRzLlNlcGFyYXRvciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZC1zZXBhcmF0b3JcIjtcclxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRzLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5BdHRhY2htZW50UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhQXR0YWNobWVudCB8fCAhQXR0YWNobWVudC5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcclxuICAgICAgICB9KSlcclxuICAgICAgICBQbHVnaW5DZXJ0aWZpZXIucGF0Y2goYXR0YWNobWVudCwgXCJjZXJ0aWZpZWQtXCIraWQpXHJcbiAgICB9fSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lc3NhZ2VIZWFkZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIk1lc3NhZ2VUaW1lc3RhbXBcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZXNzYWdlSGVhZGVyIHx8ICFNZXNzYWdlSGVhZGVyLmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMubWVzc2FnZUhlYWRlclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVzc2FnZUhlYWRlciwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xyXG4gICAgICAgIC8vIGNvbnN0IGhlYWRlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhdXRob3IuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgYXV0aG9yLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBhdXRob3IsIHRydWUpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XHJcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJhZGdlcy1cIitpZClcclxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG5cclxuICAgICAgICBkaXN0YW50LmdldEJhZGdlcyh1c2VyLmlkKVxyXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XHJcbiAgICAgICAgICAgIGJhZGdlcy5mb3JFYWNoKGJhZGdlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlID09PSBcInVzZXJcIil7Ly8gcmVxdWlyZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnVzZXIgPSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkgXHJcbiAgICAgICAgICAgICAgICBpZighYmFkZ2UuaHJlZil7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaHJlZiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogYmFkZ2UubmFtZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgYmFkZ2UuaHJlZiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcykpIDogQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoZWxlbWVudCwgZGl2MilcclxuICAgICAgICAgICAgICAgIGRpdjIuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZW1iZXJMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZW1iZXJMaXN0UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lbWJlckxpc3RJdGVtIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUgfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZS5yZW5kZXJEZWNvcmF0b3JzKSByZXR1cm47XHJcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCB1c2VyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnRoaXNPYmplY3QsIFwicHJvcHMudXNlclwiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgdXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjMycHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiYWRnZXMtXCIraWR9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS51cGRhdGVJbmplY3RvciA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgaW5qZWN0aW9uUGF0aCA9IERhdGFTdG9yZS5pbmplY3Rpb25QYXRoO1xyXG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbiAgICBjb25zdCBybXJmID0gcmVxdWlyZShcInJpbXJhZlwiKTtcclxuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xyXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZShcIm1rZGlycFwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSAvKnJlcXVpcmUoXCJyZXF1ZXN0XCIpOyovIG51bGxcclxuXHJcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGluamVjdGlvblBhdGgsIFwiLi5cIik7XHJcbiAgICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcclxuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcclxuICAgIGNvbnN0IHNhdmVkWmlwID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiaW5qZWN0b3IuemlwXCIpO1xyXG4gICAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTtcclxuXHJcbiAgICAvLyBEb3dubG9hZCB0aGUgaW5qZWN0b3IgemlwIGZpbGVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRG93bmxvYWRpbmcgXCIgKyB6aXBMaW5rKTtcclxuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5nZXQoe3VybDogemlwTGluaywgZW5jb2Rpbmc6IG51bGx9LCBhc3luYyAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHJldHVybiByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XHJcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKHNhdmVkWmlwLCByZXMpKTtcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG5cclxuICAgICAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGUoc2F2ZWRaaXAsIGJvZHksIGVyciA9PiByZXNvbHZlKCFlcnIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gc3VjY2VzcztcclxuXHJcbiAgICAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXHJcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhleHRyYWN0ZWRGb2xkZXIsIHJlcykpO1xyXG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcbiAgICBcclxuICAgIC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXHJcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcclxuICAgIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbihlbnRyeSkge1xyXG4gICAgICAgIC8vIFNraXAgZGlyZWN0b3JpZXMsIHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBta2RpcnBcclxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcclxuXHJcbiAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24oKSB7emlwZmlsZS5yZWFkRW50cnkoKTt9KTsgLy8gR28gdG8gbmV4dCBmaWxlIGFmdGVyIHRoaXNcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcclxuXHJcbiAgICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGZpbmFsIHN0ZXBcclxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoaW5qZWN0aW9uUGF0aCwgYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBgUmVuYW1pbmcgJHtwYXRoLmJhc2VuYW1lKGV4dHJhY3RlZEZvbGRlcil9IHRvICR7Zm9sZGVyTmFtZX1gKTtcclxuICAgIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIkZhaWxlZCB0byByZW5hbWUgdGhlIGZpbmFsIGRpcmVjdG9yeVwiKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiByZW5hbWUgaGFkIGlzc3VlcywgZGVsZXRlIHdoYXQgd2UgdHJpZWQgdG8gcmVuYW1lIGFuZCByZXN0b3JlIGJhY2t1cFxyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uLiByZXN0b3JpbmcgYmFja3Vwcy5cIik7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGV4dHJhY3RlZEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCBldmVyeXRoaW5nIHNob3VsZCBoYXZlIGdvbmUgc21vb3RobHkuXHJcbiAgICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMudW5saW5rKHNhdmVkWmlwLCByZXNvbHZlKSk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IENvcmUoKTsiLCJjb25zdCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9IHdpbmRvdy5yZXF1aXJlXHJcblxyXG5pbXBvcnQge2JkQ29uZmlnfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERhdGFTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSB7c2V0dGluZ3M6IHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fX07XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcImJpbmFyeVwiKSlcclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBsZXQgc2V0dGluZ3MgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwge1tyZWxlYXNlQ2hhbm5lbF06IHNldHRpbmdzfSk7XHJcbiAgICAgICAgICAgIGVsc2Ugc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwgc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIFV0aWxzLmFsZXJ0KFwiQ29ycnVwdCBTdG9yYWdlXCIsIFwiVGhlIGJkIHN0b3JhZ2UgaGFzIHNvbWVob3cgYmVjb21lIGNvcnJ1cHQuIFlvdSBtYXkgZWl0aGVyIHRyeSB0byBzYWx2YWdlIHRoZSBmaWxlIG9yIGRlbGV0ZSBpdCB0aGVuIHJlbG9hZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbmplY3Rpb25QYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5faW5qZWN0aW9uUGF0aCkgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGg7XHJcbiAgICAgICAgY29uc3QgZWxlY3Ryb24gPSByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcDtcclxuICAgICAgICBjb25zdCBiYXNlID0gZWxlY3Ryb24uZ2V0QXBwUGF0aCgpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdCYXNlID0gZWxlY3Ryb24uZ2V0UGF0aChcInVzZXJEYXRhXCIpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdMb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShyb2FtaW5nQmFzZSwgZWxlY3Ryb24uZ2V0VmVyc2lvbigpLCBcIm1vZHVsZXNcIiwgXCJkaXNjb3JkX2Rlc2t0b3BfY29yZVwiLCBcImluamVjdG9yXCIpO1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGJhc2UsIFwiLi5cIiwgXCJhcHBcIik7XHJcbiAgICAgICAgY29uc3QgcmVhbExvY2F0aW9uID0gZnMuZXhpc3RzU3luYyhsb2NhdGlvbikgPyBsb2NhdGlvbiA6IGZzLmV4aXN0c1N5bmMocm9hbWluZ0xvY2F0aW9uKSA/IHJvYW1pbmdMb2NhdGlvbiA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFyZWFsTG9jYXRpb24pIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IHJlYWxMb2NhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uZmlnRmlsZSgpIHtyZXR1cm4gdGhpcy5fY29uZmlnRmlsZSB8fCAodGhpcy5fY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmluamVjdGlvblBhdGgsIFwiYmV0dGVyZGlzY29yZFwiLCBcImNvbmZpZy5qc29uXCIpKTt9XHJcbiAgICBnZXQgQkRGaWxlKCkge3JldHVybiB0aGlzLl9CREZpbGUgfHwgKHRoaXMuX0JERmlsZSA9IHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCwgXCJiZHN0b3JhZ2UuanNvblwiKSk7fVxyXG4gICAgZ2V0IHNldHRpbmdzRmlsZSgpIHtyZXR1cm4gdGhpcy5fc2V0dGluZ3NGaWxlIHx8ICh0aGlzLl9zZXR0aW5nc0ZpbGUgPSBwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGgsIFwiYmRzZXR0aW5ncy5qc29uXCIpKTt9XHJcbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XHJcblxyXG4gICAgZ2V0U2V0dGluZ0dyb3VwKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldID0gZGF0YTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCRERhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERldk1vZGUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xpc3RlbmVyID0gdGhpcy5kZWJ1Z0xpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lciA9IHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgdGhpcy5zdGFydENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICB0aGlzLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydERlYnVnTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcERlYnVnTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydENvcHlTZWxlY3RvcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcENvcHlTZWxlY3RvcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZGVidWdMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDExOSB8fCBlLndoaWNoID09IDExOCkgey8vRjhcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIlY1slY0Rldk1vZGUlY10gJWNCcmVhay9SZXN1bWVcIiwgXCJjb2xvcjogcmVkO1wiLCBcImNvbG9yOiAjMzAzMDMwOyBmb250LXdlaWdodDo3MDA7XCIsIFwiY29sb3I6cmVkO1wiLCBcIlwiKTtcclxuICAgICAgICAgICAgZGVidWdnZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZGVidWdnZXJcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29weVNlbGVjdG9yTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGUudGFyZ2V0KTtcclxuICAgIFxyXG4gICAgICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXIsIFxyXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xyXG4gICAgICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmRpc2FibGVkUG9pbnRlckV2ZW50cylbMF0ubGF5ZXIsXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmNvbnRleHRNZW51KVswXSxcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZnVuY3Rpb24gYXR0YWNoKCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNtID0gRE9NLnF1ZXJ5KFwiLlwiK2NsYXNzSXRlbXMuY29udGV4dE1lbnUuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICAgICAgICAgIGlmICghY20pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc05hbWVMYXllcn1cIj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLmNvbnRleHRNZW51fSBiZC1jb250ZXh0LW1lbnVcIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuYXBwZW5kKGNtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGNtV3JhcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IGUuY2xpZW50WSArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUuekluZGV4ID0gXCIxMDAyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ00gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbVdyYXAucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IERPTS5xdWVyeShcIi5cIitjbGFzc05hbWVMYXllci5zcGxpdChcIiBcIilbMF0pXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZyA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW1Hcm91cH1cIj5gKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtaSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW19ICR7Y2xhc3NJdGVtcy5jbGlja2FibGV9XCI+YCk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYXBwZW5kKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLmxhYmVsfVwiPkNvcHkgU2VsZWN0b3I8L2Rpdj5gKSk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLk5hdGl2ZU1vZHVsZS5jb3B5KHNlbGVjdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBjbS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNtZy5hcHBlbmQoY21pKTtcclxuICAgICAgICAgICAgICAgIGNtLmFwcGVuZChjbWcpO1xyXG4gICAgICAgICAgICAgICAgaWYoY21XcmFwLmNsaWVudEhlaWdodCA8IGNtV3JhcC5zY3JvbGxIZWlnaHQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmcgXCIrY21XcmFwLnN0eWxlLnRvcClcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gKGNtV3JhcC5zdHlsZS50b3AgLSBjbWcuY2xpZW50SGVpZ2h0KSArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nXCIrY21XcmFwLnN0eWxlLnRvcClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXR0YWNoLCAxKTtcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0b3IoZWxlbWVudCkge1xyXG4gICAgICAgIGlmIChlbGVtZW50LmlkKSByZXR1cm4gYCMke2VsZW1lbnQuaWR9YDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBcclxuICAgICAgICAgKi9cclxuICAgICAgICBmdW5jdGlvbiBmdWxsUGF0aChlbCl7XHJcbiAgICAgICAgICAgIHZhciBuYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICB3aGlsZSAoZWwucGFyZW50Tm9kZSl7XHJcbiAgICAgICAgICAgICAgaWYgKGVsLmlkKXtcclxuICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoJyMnK2VsLmlkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsPT1lbC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QuZW50cmllcygpKS5tYXAoZSA9PiBcIi5cIitlKS5qb2luKFwiXCIpKTtcclxuICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MSxlPWVsO2UucHJldmlvdXNFbGVtZW50U2libGluZztlPWUucHJldmlvdXNFbGVtZW50U2libGluZyxjKyspO1xyXG4gICAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSsoZWwuY2xhc3NOYW1lIHx8IFwiXCIpLnNwbGl0KFwiIFwiKS5tYXAoZSA9PiBcIi5cIitlKS5qb2luKFwiXCIpK1wiOm50aC1jaGlsZChcIitjK1wiKVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsPWVsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lcy5qb2luKFwiID4gXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZnVsbFBhdGgoZWxlbWVudClcclxuICAgICAgICAvKlxyXG4gICAgICAgIGNvbnN0IHJ1bGVzID0gdGhpcy5nZXRSdWxlcyhlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBsYXRlc3RSdWxlID0gcnVsZXNbcnVsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgaWYgKGxhdGVzdFJ1bGUpIHJldHVybiBsYXRlc3RSdWxlLnNlbGVjdG9yVGV4dDtcclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGgpIHJldHVybiBgLiR7QXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCkuam9pbihcIi5cIil9YDtcclxuICAgICAgICByZXR1cm4gYC4ke0FycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdCkuam9pbihcIi5cIil9YDsqL1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJ1bGVzKGVsZW1lbnQsIGNzcyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cykge1xyXG4gICAgICAgIC8vaWYgKHdpbmRvdy5nZXRNYXRjaGVkQ1NTUnVsZXMpIHJldHVybiB3aW5kb3cuZ2V0TWF0Y2hlZENTU1J1bGVzKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IHNoZWV0cyA9IFsuLi5jc3NdLmZpbHRlcihzID0+ICFzLmhyZWYgfHwgIXMuaHJlZi5pbmNsdWRlcyhcIkJldHRlckRpc2NvcmRBcHBcIikpO1xyXG4gICAgICAgIGNvbnN0IHJ1bGVzID0gc2hlZXRzLm1hcChzID0+IFsuLi4ocy5jc3NSdWxlcyB8fCBbXSldKS5mbGF0KCk7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJ1bGVzID0gcnVsZXMuZmlsdGVyKHIgPT4gciAmJiByLnNlbGVjdG9yVGV4dCAmJiBlbGVtZW50Lm1hdGNoZXMoci5zZWxlY3RvclRleHQpICYmIHIuc3R5bGUubGVuZ3RoICYmIHIuc2VsZWN0b3JUZXh0LnNwbGl0KFwiLCBcIikubGVuZ3RoIDwgOCAmJiAhci5zZWxlY3RvclRleHQuc3BsaXQoXCIsIFwiKS5pbmNsdWRlcyhcIipcIikpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50UnVsZXM7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IEJ1Z0h1bnRlckJhZGdlIGZyb20gXCIuLi9zdmcvYnVnX2h1bnRlclwiXHJcbmltcG9ydCBMaWdodGNvcmRVc2VyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9MaWdodGNvcmRVc2VyXCI7XHJcbmltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHsgLy8gR2VuZXJhdGUgVVVJRCAoTm8gY3J5cHRvIHJuZylcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uKGMpIHtcclxuICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbn0gIFxyXG5cclxuY29uc3QgYXdhaXRpbmdCYWRnZXNQcm9taXNlcyA9IHt9XHJcbmxldCBiYWRnZXNUb0ZldGNoID0gW11cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXN0YW50U2VydmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczoge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FjaGUoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FjaGUoZGF0YSl7XHJcbiAgICAgICAgaWYodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHRoaXMuX2NhY2hlICE9PSBcIm9iamVjdFwiKXJldHVybiB0aGlzLl9jYWNoZSA9IGRhdGFcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUgPSBPYmplY3QuYXNzaWduKHRoaXMuX2NhY2hlLCBkYXRhKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZSgpe1xyXG4gICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkRlbGV0aW5nIGFsbCBpbmZvcyBhYm91dCB5b3Ugb24gTGlnaHRjb3JkIFNlcnZlcnMuLi5cIiwge3R5cGU6IFwid2FyblwifSlcclxuICAgICAgICByZXR1cm4gaGFuZGxlUmVxdWVzdChSb3V0ZXMuZGVsZXRlLCBcImRlbGV0ZVwiKVxyXG4gICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZGVsZXRlIGFsbCBpbmZvcm1hdGlvbnM6ICR7KHJlcy5zdGF0dXMrXCIgXCIrcmVzLnN0YXR1c1RleHQrXCIgXCIrYXdhaXQgcmVzLnRleHQoKSl9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zLmApXHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIlN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zXCIsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pXHJcbiAgICAgICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gPSBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHtlcnIuc3RhY2t9YClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGN1c3RvbSBiYWRnZXMgZnJvbSB0aGUgdXNlciBJRC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSB1c2VyIElEIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Q29uc3RhbnRzW1wiYmFkZ2VzXCJdPn1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0QmFkZ2VzKHVzZXIpe1xyXG4gICAgICAgIGlmKHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdKXJldHVybiB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIGlmKGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0pcmV0dXJuIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cclxuXHJcbiAgICAgICAgbGV0IHJlc29sdmVcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHJlc29sdmUgPSByZXMpKVxyXG4gICAgICAgIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0gPSBuZXdQcm9taXNlXHJcblxyXG4gICAgICAgIGNvbnN0IGJhZGdlcyA9IFtdXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBDb25zdGFudHMuYmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoYmFkZ2UuZGVmYXVsdFVzZXJzLmluY2x1ZGVzKHVzZXIpKWJhZGdlcy5wdXNoKGJhZGdlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmZXRjaGVkQmFkZ2VzID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYmFkZ2VzVG9GZXRjaC5wdXNoKFt1c2VyLCByZXNvbHZlXSlcclxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IGJhZGdlc1RvRmV0Y2hcclxuICAgICAgICAgICAgICAgIGlmKHVzZXJzLmxlbmd0aCA9PT0gMClyZXR1cm5cclxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChSb3V0ZXMuYmFkZ2VzLCBcIlBPU1RcIiwgSlNPTi5zdHJpbmdpZnkodXNlcnMubWFwKGUgPT4gZVswXSkpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2VCb2R5KVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHVzZXJzLmZpbmQocHJvbWlzZSA9PiBwcm9taXNlWzBdID09PSB1c2VyLnVzZXJfaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VbMV0odXNlci5iYWRnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoIUNvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBXZSBkbyBub3QgaGF2ZSB0aGUgQ29tcG9uZW50LCBza2lwIGl0LlxyXG4gICAgICAgICAgICBpZihiYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBBbHJlYWR5IGluc2VydGVkLlxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIH0sIDYwMDAwMCk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxyXG4gICAgICAgIGRlbGV0ZSBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XHJcbiAgICBjb25zb2xlLmxvZyhgU2VuZGluZyByZXF1ZXN0IG9uICR7cm91dGV9IHdpdGggbWV0aG9kICR7bWV0aG9kfSBhbmQgYm9keWAsIGRhdGEpXHJcbiAgICByZXR1cm4gbm9kZUZldGNoKGAke0NvbnN0YW50cy5TRVJWRVJfVVJMfS9hcGkvdjEke3JvdXRlfWAsIHtcclxuICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNMSUVOVFwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi4oZGF0YSA/IHtcclxuICAgICAgICAgICAgYm9keTogZGF0YVxyXG4gICAgICAgIH0gOiB7fSlcclxuICAgIH0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBTRVJWRVJfVVJMOiBcImh0dHA6Ly8xMjcuMC4wLjFcIixcclxuICAgIGJhZGdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmQgVXNlclwiLFxyXG4gICAgICAgICAgICBpZDogXCIwMWNmYTdiMC03Y2RiLTRiMGUtODI1OC05YzZhNzgyMzVjOTNcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXHJcbiAgICAgICAgICAgICAgICBcInVzZXJcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IExpZ2h0Y29yZFVzZXJCYWRnZVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmQgQnVnIEh1bnRlclwiLFxyXG4gICAgICAgICAgICBpZDogXCJmMDQ2OThmNS04MTZiLTQxZTMtYmQwMS05MjI5MTE5M2Q3YTVcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBCdWdIdW50ZXJCYWRnZSxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcy9idWdfaHVudGVyXCJcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZXMgPSB7XHJcbiAgICBiYWRnZXM6IGAvdXNlcnMvYmFkZ2VzYCxcclxuICAgIGRlbGV0ZTogYC9kZWxldGVgXHJcbn0iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTggWmFjaGFyeSBSYXVlblxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcclxuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXHJcbiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXHJcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcclxuICogdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELFxyXG4gKiBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQVxyXG4gKiBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUXHJcbiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRlxyXG4gKiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkVcclxuICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXHJcbiAqIFxyXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CRFBsdWdpbkxpYnJhcnlcclxuICovXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZVxyXG4gKiBAbmFtZSBPZmZzZXRcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRvcCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgLSBSaWdodCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIC0gQm90dG9tIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gTGVmdCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gT3V0ZXIgaGVpZ2h0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gT3V0ZXIgd2lkdGggb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKi9cclxuXHJcbiAvKipcclxuICogRnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgYWRkZWQgbGlzdGVuZXIuXHJcbiAqIEBjYWxsYmFjayBtb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJcclxuICovXHJcbiBcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NVG9vbHMge1xyXG5cclxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xyXG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIEFkZHMgYSBzdHlsZSB0byB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgYXMgdGhlIGVsZW1lbnQgaWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY3NzIC0gY3NzIHRvIGFkZCB0byB0aGUgZG9jdW1lbnRcclxuXHQgKi9cclxuXHRzdGF0aWMgYWRkU3R5bGUoaWQsIGNzcykge1xyXG5cdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoRE9NVG9vbHMuY3JlYXRlRWxlbWVudChgPHN0eWxlIGlkPVwiJHtpZH1cIj4ke2Nzc308L3N0eWxlPmApKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlU3R5bGUoaWQpIHtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMvcmVxdWlyZXMgYSByZW1vdGUgc2NyaXB0IHRvIGJlIGxvYWRlZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGZvciB0aGlzIHNjcmlwdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSB1cmwgZnJvbSB3aGljaCB0byBsb2FkIHRoZSBzY3JpcHRcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgYWRkU2NyaXB0KGlkLCB1cmwpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuXHRcdFx0Y29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuXHRcdFx0c2NyaXB0LmlkID0gaWQ7XHJcblx0XHRcdHNjcmlwdC5zcmMgPSB1cmw7XHJcblx0XHRcdHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcclxuXHRcdFx0c2NyaXB0Lm9ubG9hZCA9IHJlc29sdmU7XHJcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYSByZW1vdGUgc2NyaXB0IGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTY3JpcHQoaWQpIHtcclxuICAgICAgICBpZCA9IHRoaXMuZXNjYXBlSUQoaWQpO1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBodHRwczovL2phdmFzY3JpcHQuaW5mby9qcy1hbmltYXRpb25cclxuICAgIHN0YXRpYyBhbmltYXRlKHt0aW1pbmcgPSBfID0+IF8sIHVwZGF0ZSwgZHVyYXRpb259KSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZSkge1xyXG4gICAgICAgICAgLy8gdGltZUZyYWN0aW9uIGdvZXMgZnJvbSAwIHRvIDFcclxuICAgICAgICAgIGxldCB0aW1lRnJhY3Rpb24gPSAodGltZSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xyXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA+IDEpIHRpbWVGcmFjdGlvbiA9IDE7XHJcbiAgICAgIFxyXG4gICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGF0ZVxyXG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aW1pbmcodGltZUZyYWN0aW9uKTtcclxuICAgICAgXHJcbiAgICAgICAgICB1cGRhdGUocHJvZ3Jlc3MpOyAvLyBkcmF3IGl0XHJcbiAgICAgIFxyXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA8IDEpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICBcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBteSBzaGl0IHZlcnNpb24gb2Ygbm90IGhhdmluZyB0byB1c2UgYCRgIGZyb20galF1ZXJ5LiBNZWFuaW5nXHJcbiAgICAgKiB0aGF0IHlvdSBjYW4gcGFzcyBhIHNlbGVjdG9yIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucXVlcnl9LlxyXG4gICAgICogSXQgYWxzbyBtZWFucyB0aGF0IHlvdSBjYW4gcGFzcyBhIHN0cmluZyBvZiBodG1sIGFuZCBpdCB3aWxsIHBlcmZvcm0gYW5kIHJldHVybiBgcGFyc2VIVE1MYC5cclxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTFxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucXVlcnlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5IG9yIEhUTUwgdG8gcGFyc2VcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gRWl0aGVyIHRoZSByZXN1bHQgb2YgYHBhcnNlSFRNTGAgb3IgYHF1ZXJ5YFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUShzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlSFRNTChzZWxlY3Rvcik7XHJcbiAgICAgICAgY29uc3QgaXNIVE1MID0gZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0ID8gQXJyYXkuZnJvbShlbGVtZW50KS5zb21lKG4gPT4gbi5ub2RlVHlwZSA9PT0gMSkgOiBlbGVtZW50Lm5vZGVUeXBlID09PSAxO1xyXG4gICAgICAgIGlmIChpc0hUTUwpIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxyXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIGZvdW5kIGVsZW1lbnQgb3IgbnVsbCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5KHNlbGVjdG9yLCBiYXNlRWxlbWVudCkge1xyXG4gICAgICAgIGlmICghYmFzZUVsZW1lbnQpIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBBcnJheSBvZiBhbGwgZm91bmQgZWxlbWVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5QWxsKHNlbGVjdG9yLCBiYXNlRWxlbWVudCkge1xyXG4gICAgICAgIGlmICghYmFzZUVsZW1lbnQpIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIG9mIEhUTUwgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsXHJcbiAgICAgKiB0aGUgcGFyc2VkIEhUTUwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGRvY3VtZW50IGZyYWdtZW50IHtAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50fS5cclxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxpc3Qgb2YgZWxlbWVudHMgYXQgdGhlIHRvcCBsZXZlbCwgdGhleSBjYW4gdGhlbiBiZSBhcHBlbmRlZCBhbGwgYXQgb25jZSB0byBhbm90aGVyIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbGlzdCBvZiBwYXJzZWRcclxuICAgICAqIG5vZGVzIGFuZCB0aGVyZSB3ZXJlIG11bHRpcGxlIHRvcCBsZXZlbCBub2Rlcywgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgbm9kZSBpcyByZXR1cm5lZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gSFRNTCB0byBiZSBwYXJzZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZyYWdtZW50PWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm4gc2hvdWxkIGJlIHRoZSByYXcgYERvY3VtZW50RnJhZ21lbnRgXHJcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIFRoZSByZXN1bHQgb2YgSFRNTCBwYXJzaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xyXG4gICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICAgIGlmIChmcmFnbWVudCkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAxID8gbm9kZS5jaGlsZE5vZGVzIDogbm9kZS5jaGlsZE5vZGVzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBbHRlcm5hdGUgbmFtZSBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5wYXJzZUhUTUx9ICovXHJcbiAgICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7cmV0dXJuIHRoaXMucGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50KTt9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBzdHJpbmcgb2YgaHRtbCBhbmQgZXNjYXBlcyBpdCB1c2luZyB0aGUgYnJvd2VyJ3Mgb3duIGVzY2FwaW5nIG1lY2hhbmlzbS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBlc2NhcGVkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBlc2NhcGVIVE1MKGh0bWwpIHtcclxuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xyXG4gICAgICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgc3BhbkVsZW1lbnQuYXBwZW5kKHRleHROb2RlKTtcclxuICAgICAgICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSBodG1sO1xyXG4gICAgICAgIHJldHVybiBzcGFuRWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byBhZGRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFkZENsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGxpc3Qgb2YgY2xhc3NlcyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gcmVtb3ZlXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZW1vdmVDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50OiBUb2dnbGUgY2xhc3MgdmFsdWU7XHJcbiAgICAgKiBpLmUuLCBpZiBjbGFzcyBleGlzdHMgdGhlbiByZW1vdmUgaXQgYW5kIHJldHVybiBmYWxzZSwgaWYgbm90LCB0aGVuIGFkZCBpdCBhbmQgcmV0dXJuIHRydWUuXHJcbiAgICAgKiBXaGVuIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQ6XHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIGNsYXNzIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gdG9nZ2xlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmRpY2F0b3JdIC0gT3B0aW9uYWwgaW5kaWNhdG9yIGZvciBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHRvZ2dsZWRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRvZ2dsZUNsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSwgaW5kaWNhdG9yKSB7XHJcbiAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGlmICh0eXBlb2YoaW5kaWNhdG9yKSAhPT0gXCJ1bmRlZmluZWRcIikgY2xhc3NuYW1lLmZvckVhY2goYyA9PiBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYywgaW5kaWNhdG9yKSk7XHJcbiAgICAgICAgZWxzZSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjKSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBoYXMgYSBzcGVjaWZpYyBjbGFzc1xyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBjbGFzcywgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUpIHtcclxuICAgICAgICByZXR1cm4gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpLmV2ZXJ5KGMgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoYykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgb25lIGNsYXNzIHdpdGggYW5vdGhlclxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGROYW1lIC0gTmFtZSBvZiBjbGFzcyB0byByZXBsYWNlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lIGZvciB0aGUgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlcGxhY2VDbGFzcyhlbGVtZW50LCBvbGROYW1lLCBuZXdOYW1lKSB7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVwbGFjZShvbGROYW1lLCBuZXdOYW1lKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBhcHBlbmRlZCB0byBhbm90aGVyIG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhhdE5vZGUgLSBOb2RlIGZvciBgdGhpc05vZGVgIHRvIGJlIGFwcGVuZGVkIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXBwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5hcHBlbmQodGhpc05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgcHJlcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgcHJlcGVuZGVkIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJlcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhhdE5vZGUucHJlcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuaW5zZXJ0QWZ0ZXIob3RoZXJFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGluc2VydEFmdGVyKHRoaXNOb2RlLCB0YXJnZXROb2RlKSB7XHJcbiAgICAgICAgdGFyZ2V0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzTm9kZSwgdGFyZ2V0Tm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuYWZ0ZXIobmV3RWxlbWVudClgLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIFRoZSBub2RlIHRvIGluc2VydFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhZnRlcih0aGlzTm9kZSwgbmV3Tm9kZSkge1xyXG4gICAgICAgIHRoaXNOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXNOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIG5leHQgc2libGluZyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIE9wdGlvbmFsIHNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RvciA/IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIisgXCIgKyBzZWxlY3RvcikgOiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHN1YnNlcXVlbnQgc2libGluZ3MuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBuZXh0IHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHRBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ+ICpcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdWJzZXF1ZW50IHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgZm9sbG93aW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHRVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgbmV4dC5wdXNoKGVsZW1lbnQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgIGlmIChzZWxlY3RvcikgcmV0dXJuIHByZXZpb3VzICYmIHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpID8gcHJldmlvdXMgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHByZWNlZWRpbmcgc2libGluZ3MuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzQWxsKGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107IFxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIHdoaWNoIGluZGV4IGluIGNoaWxkcmVuIGEgY2VydGFpbiBub2RlIGlzLiBTaW1pbGFyIHRvIGpRdWVyeSdzIGAkLmluZGV4KClgXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIG5vZGUgdG8gZmluZCBpdHMgaW5kZXggaW4gcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBJbmRleCBvZiB0aGUgbm9kZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5kZXhJblBhcmVudChub2RlKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICBsZXQgbnVtID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSBub2RlKSByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT0gMSkgbnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLmluZGV4SW5QYXJlbnR9ICovXHJcbiAgICBzdGF0aWMgaW5kZXgobm9kZSkge3JldHVybiB0aGlzLmluZGV4SW5QYXJlbnQobm9kZSk7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IGlmIGl0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHBhcmVudCBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHBhcmVudFxyXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBzaWJsaW5nIGVsZW1lbnQgb3IgbnVsbFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiAhc2VsZWN0b3IgfHwgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpID8gZWxlbWVudC5wYXJlbnRFbGVtZW50IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGQoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZENoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgYW5jZXN0b3JzIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgcGFyZW50cyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBwYXJlbnRzIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpO1xyXG4gICAgICAgIGVsc2Ugd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYW5jZXN0b3JzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgYW5jZXN0b3JzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgIWVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc2libGluZ3Mgb2YgdGhlIGVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCIqXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHNpYmxpbmdzIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNpYmxpbmdzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCIqXCIpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihlID0+IGUgIT0gZWxlbWVudCAmJiBlLm1hdGNoZXMoc2VsZWN0b3IpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyBjc3Mgc3R5bGVzIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgc3R5bGUgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN0eWxlLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gQXR0cmlidXRlIHRvIGdldCBvciBzZXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gVmFsdWUgdG8gc2V0IGZvciBhdHRyaWJ1dGVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjc3MoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGVbYXR0cmlidXRlXSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSB3aWR0aCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHdpZHRoIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSB3aWR0aC4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBXaWR0aCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3aWR0aChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLndpZHRoKTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGhlaWdodCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIGhlaWdodCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgaGVpZ2h0LiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIEhlaWdodCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoZWlnaHQoZWxlbWVudCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpbm5lciB0ZXh0IG9mIGFuIGVsZW1lbnQgaWYgZ2l2ZW4gYSB2YWx1ZSwgb3RoZXJ3aXNlIHJldHVybnMgaXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgdGV4dCBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XSAtIENvbnRlbnQgdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVpdGhlciB0aGUgc3RyaW5nIHNldCBieSB0aGlzIGNhbGwgb3IgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdGV4dChlbGVtZW50LCB0ZXh0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0ZXh0KSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudDtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBpbm5lciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBpbm5lciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbm5lckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgd2lkdGggb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgb3V0ZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlcldpZHRoKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG91dGVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciBoZWlnaHQgb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgb3V0ZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb3V0ZXJIZWlnaHQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgcGFnZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG9mZnNldCBvZlxyXG4gICAgICogQHJldHVybiB7T2Zmc2V0fSAtIFRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZnNldChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBsaXN0ZW5lcnMoKSB7IHJldHVybiB0aGlzLl9saXN0ZW5lcnMgfHwgKHRoaXMuX2xpc3RlbmVycyA9IHt9KTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvbmAgZnVuY3Rpb24gYW5kIGNhbiAqaG9wZWZ1bGx5KiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS5cclxuICAgICAqIFxyXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIG9uY2UuXHJcbiAgICAgKiBgY29uc3QgY2FuY2VsID0gRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJmaXJlZCFcIik7IGNhbmNlbCgpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb24oZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgbWV0aG9kIG1hdGNoZXMge0BsaW5rIG1vZHVsZTpET01Ub29scy5vbn0gYnV0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGZcclxuICAgICAqIGFuZCByZW1vdmVzIHRoZSBsaXN0ZW5lciB1cG9uIHRoZSBmaXJzdCBmaXJpbmcgb2YgdGhlIGRlc2lyZWQgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uY2UoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH0gOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgbWF0Y2hGaWx0ZXIgPSBsaXN0ZW5lciA9PiBsaXN0ZW5lci5ldmVudCA9PSB0eXBlLCBkZWZhdWx0RmlsdGVyID0gXyA9PiBfO1xyXG4gICAgICAgIGlmIChlbGVtZW50KSBtYXRjaEZpbHRlciA9IGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50LCBkZWZhdWx0RmlsdGVyID0gbCA9PiBsLmVsZW1lbnQgPT0gZWxlbWVudDtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0eXBlID8gbGlzdGVuZXJzLmZpbHRlcihtYXRjaEZpbHRlcikgOiBsaXN0ZW5lcnMuZmlsdGVyKGRlZmF1bHRGaWx0ZXIpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbGlzdC5sZW5ndGg7IGMrKykgbGlzdFtjXS5jYW5jZWwoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9mZmAgZnVuY3Rpb24gYW5kIGNhbiAqaG9wZWZ1bGx5KiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS5cclxuICAgICAqIFxyXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZWQgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcIi5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGNsaWNrIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihcImNsaWNrLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoRWxlbWVudHxzdHJpbmcpfSBlbGVtZW50IC0gRWxlbWVudCB0byByZW1vdmUgbGlzdGVuZXIgZnJvbVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudF0gLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBbZGVsZWdhdGVdIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvZmYoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZWxlbWVudCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuX19vZmZBbGwoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkgcmV0dXJuIHRoaXMuX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGUgbm9kZSBpcyBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IGJvZHkuXHJcbiAgICAgKiBUaGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIHVwb24gZmlyaW5nLlxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIG5vZGUgdG8gd2FpdCBmb3JcclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IGNhbGxiYWNrIC0gZnVuY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9uTW91bnQgLSBkZXRlcm1pbmVzIGlmIGl0IHNob3VsZCBmaXJlIG9uIE1vdW50IG9yIG9uIFVubW91bnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIG9uTW91bnQgPSB0cnVlKSB7XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnVuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2ssIG11dGF0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG9uTW91bnQgPyBtdXRhdGlvbi5hZGRlZE5vZGVzIDogbXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudENoYW5nZX0gd2l0aCB0aGlyZCBwYXJhbWV0ZXIgYHRydWVgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrKTsgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudENoYW5nZX0gd2l0aCB0aGlyZCBwYXJhbWV0ZXIgYGZhbHNlYCAqL1xyXG4gICAgc3RhdGljIG9uVW5tb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudH0gKi9cclxuICAgIHN0YXRpYyBvbkFkZGVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnQobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uVW5tb3VudH0gKi9cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCBjb21iaW5lcyBtdWx0aXBsZSBlbGVtZW50cyBpbnRvIG9uZSBwYXJlbnQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gYXJyYXkgb2YgZWxlbWVudHMgdG8gcHV0IGludG8gYSBzaW5nbGUgcGFyZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3cmFwKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgY29uc3QgZG9tV3JhcHBlciA9IHRoaXMucGFyc2VIVE1MKGA8ZGl2IGNsYXNzPVwiZG9tLXdyYXBwZXJcIj48L2Rpdj5gKTtcclxuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IGVsZW1lbnRzLmxlbmd0aDsgZSsrKSBkb21XcmFwcGVyLmFwcGVuZENoaWxkKGVsZW1lbnRzW2VdKTtcclxuICAgICAgICByZXR1cm4gZG9tV3JhcHBlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc29sdmVzIHRoZSBub2RlIHRvIGFuIEhUTUxFbGVtZW50LiBUaGlzIGlzIG1haW5seSB1c2VkIGJ5IGxpYnJhcnkgbW9kdWxlcy5cclxuICAgICAqIEBwYXJhbSB7KGpRdWVyeXxFbGVtZW50KX0gbm9kZSAtIG5vZGUgdG8gcmVzb2x2ZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVzb2x2ZUVsZW1lbnQobm9kZSkge1xyXG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge2JkQ29uZmlnLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG4vL2ltcG9ydCBEaXNjb3JkQ3J5cHQgZnJvbSBcIi4vRGlzY29yZENyeXB0XCI7XHJcblxyXG5jb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBFbW9qaVJlZ2V4OiAvPGE/XFwuKFxcdyspXFwuKFxcZCspPi9nXHJcbn1cclxuXHJcbmxldCBDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxyXG5sZXQgRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbmxldCBBdXRvY29tcGxldGVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilbMF1cclxubGV0IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylbMF1cclxubGV0IEVtb2ppTW9kdWxlUXVlcnkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylbMF1cclxubGV0IE1lc3NhZ2VzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVswXVxyXG5sZXQgZ3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylbMF1cclxubGV0IGVtb2ppU2VhcmNoID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW9qaU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuaW5pdCgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpe1xyXG4gICAgICAgIC8qKiBFbW9qaSBBdXRvQ29tcGxldGUgKi9cclxuICAgICAgICBpZighQXV0b2NvbXBsZXRlTW9kdWxlKUF1dG9jb21wbGV0ZU1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilcclxuICAgICAgICBpZighQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMpQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylcclxuICAgICAgICBpZighRW1vamlNb2R1bGVRdWVyeSlFbW9qaU1vZHVsZVF1ZXJ5ID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKVxyXG4gICAgICAgIGlmKCFNZXNzYWdlcylNZXNzYWdlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpXHJcbiAgICAgICAgaWYoIWd1aWxkTW9kdWxlKWd1aWxkTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVxyXG4gICAgICAgIGlmKCFlbW9qaVNlYXJjaCllbW9qaVNlYXJjaCA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0KVxyXG4gICAgICAgIGlmKEF1dG9jb21wbGV0ZU1vZHVsZSAmJiBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyAmJiBFbW9qaU1vZHVsZVF1ZXJ5ICYmIE1lc3NhZ2VzICYmIGd1aWxkTW9kdWxlICYmIGVtb2ppU2VhcmNoKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcclxuICAgICAgICAgICAgY29uc3QgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnNcclxuICAgICAgICAgICAgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IGZ1bmN0aW9uKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgdmFsdWUuTElHSFRDT1JEX0VNT0pJUyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKGFyZzEsIGFyZzIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIFwiLlwiID09PSBhcmcxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVtb2ppVXNhYmxlKGNvbmRpdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHRzKHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IEVtb2ppTW9kdWxlUXVlcnkuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cyh0LCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUmVzdWx0cyhlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoZSwgdCwgYS5lbW9qaXMsIG4sIHIsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSkksIEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LkVtb2ppLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaTogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQgfHwgZS51bmlxdWVOYW1lIHx8IGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbDogXCIuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbGQ6IG51bGwgIT0gZS5ndWlsZElkID8gZ3VpbGRNb2R1bGUuZGVmYXVsdC5nZXRHdWlsZChlLmd1aWxkSWQpIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIi5cIiArIGUgKyBcIi5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFBsYWluVGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRSYXdUZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IHN0YXJ0IGF1dG9jb21wbGV0aW9uIG9mIExpZ2h0Y29yZCdzIGVtb2ppcy5cIikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogRW1vamkgZGlzcGxheSAqL1xyXG4gICAgICAgIHdoaWxlICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb2ppUmVuZGVyKXtcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2VcIilcclxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlKXJldHVyblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50XCIpXHJcbiAgICAgICAgICAgICAgICBpZighY29udGVudCB8fCAhY29udGVudC5sZW5ndGgpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgPSBEaXNjb3JkQ3J5cHQuZGVjcnlwdENvbnRlbnQoY29udGVudClcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7e1xyXG4gICAgICAgICAgICAgICAgICogIHJhdzogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIG5hbWU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBpZDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIGFuaW1hdGVkOiBib29sZWFuXHJcbiAgICAgICAgICAgICAgICAgKiB9W119XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGxldCBlbW9qaXMgPSBbXVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gW11cclxuICAgICAgICAgICAgICAgIGZvcihsZXQgbm9kZSBvZiBjb250ZW50KXtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG5vZGUpICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChub2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUGFyc2VkID0gZmFsc2VcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IENvbnN0YW50cy5FbW9qaVJlZ2V4LmV4ZWMobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnNlZCA9IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFFbW9qaU1vZHVsZUFwaSlFbW9qaU1vZHVsZUFwaSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gRW1vamlNb2R1bGVBcGkuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQocGFyc2VkWzJdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW1vamkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGVtb2ppLmFuaW1hdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbW9qaS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZW1vamkuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IHBhcnNlZFswXS5zdGFydHNXaXRoKFwiPGFcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcnNlZFsxXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZFsyXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocGFyc2VkKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGhhc1BhcnNlZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRzID0gbm9kZS5zcGxpdChcIiBcIikubWFwKCh3b3JkLCBpbmRleCwgYXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighd29yZClyZXR1cm4gXCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBlbW9qaXMuZmluZChlID0+IGUucmF3ID09IHdvcmQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZW1vamkpcmV0dXJuIHdvcmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFDdXN0b21FbW9qaU1vZHVsZSlDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tRW1vamlNb2R1bGUuQ3VzdG9tRW1vamksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgLiR7ZW1vamkubmFtZX0uYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlJZDogZW1vamkuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtYm9hYmxlOiBhcnIubGVuZ3RoID09PSAxICYmIGNvbnRlbnQubGVuZ3RoID09PSAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJldmlvdXMubGVuZ3RoID09PSAwKXJldHVybiBbY3VycmVudF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjdXJyZW50ID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSArPSBgICR7Y3VycmVudH1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiK2N1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiLCBjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2goLi4ud29yZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChub2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnNoaWZ0KClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlKG5ld0NvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5wdXNoKG5ld0NvbnRlbnQuc2hpZnQoKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIoKTtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gRChlLCB0LCBuLCByLCBvLCBpLCBzLCB1LCBsLCBjKSB7XHJcbiAgICBpZiAobnVsbCA9PSBuIHx8IDAgPT09IG4ubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIHZhciBkID0gbi5tYXAoKGZ1bmN0aW9uKGUsIG4pIHtcclxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh1LCBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgb25DbGljazogbyxcclxuICAgICAgICAgICAgb25Ib3ZlcjogcixcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHQgPT09IG4sXHJcbiAgICAgICAgICAgIGluZGV4OiBuXHJcbiAgICAgICAgfSwgbChlLCBuKSkpXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gW1IoaSwgcywgZSwgYyksIGRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFIoZSwgdCwgbiwgcikge1xyXG4gICAgdmFyIGEgPSAobi5sZW5ndGggPiAwID8gZS5mb3JtYXQoe1xyXG4gICAgICAgIHByZWZpeDogcihuKVxyXG4gICAgfSkgOiB0KVxyXG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSl7XHJcbiAgICAgICAgYS51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwge30sIFwiW0xpZ2h0Y29yZF0gXCIpKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgYSA9IFwiW0xJR0hUQ09SRF0gXCIrYVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuVGl0bGUsIHtcclxuICAgICAgICB0aXRsZTogYVxyXG4gICAgfSwgYSlcclxufVxyXG5SLmRpc3BsYXlOYW1lID0gXCJyZW5kZXJIZWFkZXJcIjtcclxuXHJcbmxldCBFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxubGV0IGlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlICYmIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcbmxldCBpc1VzYWJsZSA9IGZhbHNlXHJcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcclxuXHJcbmZ1bmN0aW9uIHNldEVtb2ppVXNhYmxlKHVzYWJsZSl7XHJcbiAgICBpc1VzYWJsZSA9IHVzYWJsZVxyXG4gICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlyZXR1cm5cclxuICAgIGlmKCFpc0Vtb2ppRGlzYWJsZWQpaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxuXHJcbiAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQgPSBmdW5jdGlvbihlbW9qaSl7XHJcbiAgICAgICAgaWYoaXNVc2FibGUpe1xyXG4gICAgICAgICAgICBpZihlbW9qaS5zdXJyb2dhdGVzIHx8IGVtb2ppLmRpdmVyc2l0eSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRW1vamlEaXNhYmxlZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgIH1cclxufSIsImltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5pbXBvcnQgKiBhcyBlbGVjdHJvbiBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCBkZWJ1ZyA9IHRydWVcclxuY29uc3QgY2FjaGUgPSB7fVxyXG5jb25zdCBjYWNoZTIgPSB7fVxyXG4vKlxyXG5jb25zdCBQaW5uZWRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRQaW5uZWRNZXNzYWdlcylbMF0uZGVmYXVsdFxyXG5jb25zdCBDaGFubmVsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q2hhbm5lbElkKVswXS5kZWZhdWx0XHJcbmNvbnN0IGZldGNoTWVzc2FnZXNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5mZXRjaE1lc3NhZ2VzKVswXS5kZWZhdWx0XHJcbmNvbnN0IGZldGNoTWVzc2FnZXNNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZmV0Y2hNZXNzYWdlcylbMV0uZGVmYXVsdFxyXG5jb25zdCBnZXRNZXNzYWdlc01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldE1lc3NhZ2VzKVswXS5kZWZhdWx0Ki9cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBQbHVnaW5DZXJ0aWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXt9XHJcblxyXG4gICAgcGF0Y2goYXR0YWNobWVudCwgaWQpe1xyXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICAgICAgLypjb25zdCBkaXNwYXRjaGVyID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyXHJcbiAgICAgICAgY29uc3QgY29uc3RhbnRzID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5jb25zdGFudHNcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGZXRjaE1lc3NhZ2VzID0gZmV0Y2hNZXNzYWdlc01vZHVsZS5mZXRjaE1lc3NhZ2VzXHJcbiAgICAgICAgZmV0Y2hNZXNzYWdlc01vZHVsZS5mZXRjaE1lc3NhZ2VzID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBvcmlnaW5hbEZldGNoTWVzc2FnZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKVxyXG4gICAgICAgICAgICBpZihyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIFByb21pc2Upe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWVcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldiA9IGdldE1lc3NhZ2VzTW9kdWxlLmdldE1lc3NhZ2VzKENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbElkKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjb25zdCBtZXNzYWdlIG9mIGV2Ll9hcnJheSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgfHwgW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCljb250aW51ZSAvLyBubyBhdHRhY2htZW50c1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmV0Y2hNZXNzYWdlczIgPSBmZXRjaE1lc3NhZ2VzTW9kdWxlMi5mZXRjaE1lc3NhZ2VzXHJcbiAgICAgICAgZmV0Y2hNZXNzYWdlc01vZHVsZTIuZmV0Y2hNZXNzYWdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxGZXRjaE1lc3NhZ2VzMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXHJcbiAgICAgICAgICAgIGlmKHJldHVyblZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ID0gZ2V0TWVzc2FnZXNNb2R1bGUuZ2V0TWVzc2FnZXMoQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsSWQoKSlcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNvbnN0IG1lc3NhZ2Ugb2YgZXYuX2FycmF5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXR0YWNobWVudHMubGVuZ3RoID09PSAwKWNvbnRpbnVlIC8vIG5vIGF0dGFjaG1lbnRzXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWxyZWFkeVVzZWQgPSB7fVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsR2V0UGlubmVkTWVzc2FnZXMgPSBQaW5uZWRNb2R1bGUuZ2V0UGlubmVkTWVzc2FnZXMuYmluZChQaW5uZWRNb2R1bGUpXHJcbiAgICAgICAgUGlubmVkTW9kdWxlLmdldFBpbm5lZE1lc3NhZ2VzID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgY29uc3QgcGlubmVkID0gb3JpZ2luYWxHZXRQaW5uZWRNZXNzYWdlcyguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgIGlmKCFwaW5uZWQgfHwgYWxyZWFkeVVzZWRbcGlubmVkLmlkXSlyZXR1cm4gcGlubmVkXHJcbiAgICAgICAgICAgIGFscmVhZHlVc2VkW3Bpbm5lZC5pZF0gPSB0cnVlXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhbHJlYWR5VXNlZFtwaW5uZWQuaWRdXHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgbWVzc2FnZSBvZiBwaW5uZWQubWVzc2FnZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCljb250aW51ZSAvLyBubyBhdHRhY2htZW50c1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudClcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCA1MCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcGlubmVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShjb25zdGFudHMuQWN0aW9uVHlwZXMuTUVTU0FHRV9DUkVBVEUsIChldikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXYubWVzc2FnZVxyXG4gICAgICAgICAgICBpZihtZXNzYWdlLmNoYW5uZWxfaWQgIT09IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbElkKCkpcmV0dXJuXHJcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdXHJcbiAgICAgICAgICAgICAgICBpZihhdHRhY2htZW50cy5sZW5ndGggPT09IDApcmV0dXJuIC8vIG5vIGF0dGFjaG1lbnRzXHJcblxyXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGdldE1lc3NhZ2VzTW9kdWxlLmdldE1lc3NhZ2VzKENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbElkKCkpXHJcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvcihjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzLl9hcnJheSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgfHwgW11cclxuICAgICAgICAgICAgICAgIGlmKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCljb250aW51ZSAvLyBubyBhdHRhY2htZW50c1xyXG5cclxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSovXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCBpZCl7XHJcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc3BsaXQoL1teXFx3XFxkXSsvZylcclxuICAgIGxldCBpc0hhcm1mdWwgPSBmYWxzZVxyXG4gICAgZm9yKGxldCBrZXl3b3JkIG9mIGRhdGEpe1xyXG4gICAgICAgIGZvcihsZXQgb29mIG9mIFtcclxuICAgICAgICAgICAgXCJ0b2tlblwiLFxyXG4gICAgICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgICAgIFwicGhvbmVcIixcclxuICAgICAgICAgICAgXCJNRkFcIixcclxuICAgICAgICAgICAgXCIyZmFcIixcclxuICAgICAgICAgICAgXCJwcm9jZXNzXCIsXHJcbiAgICAgICAgICAgIFwiY2hpbGRfcHJvY2Vzc1wiLFxyXG4gICAgICAgICAgICBcImxvY2FsU3RvcmFnZVwiLFxyXG4gICAgICAgICAgICBcImV2YWxcIixcclxuICAgICAgICAgICAgXCJnZXRHbG9iYWxcIixcclxuICAgICAgICAgICAgXCJCcm93c2VyV2luZG93XCJcclxuICAgICAgICBdKXtcclxuICAgICAgICAgICAgaWYoa2V5d29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG9vZi50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSBcInRva2VuIHN0ZWFsZXIvdmlydXNcIlxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBub19jb21tZW50cyA9IGRhdGEucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3woW15cXFxcOl18XilcXC9cXC8uKiQvZ20sIFwiXCIpLnRyaW0oKS8vIHJlbW92aW5nIHRoZSBNRVRBIGNvbW1lbnQgZnJvbSBwbHVnaW5zXHJcbiAgICAgICAgaWYoKC92YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2kpLnRlc3Qobm9fY29tbWVudHMpKXtcclxuICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJvYmZ1c2NhdGlvbi9oaWRkZW4gY29kZVwiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighaXNIYXJtZnVsKXtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXhwcyA9IFtcclxuICAgICAgICAgICAgICAgIC8qKiBoZXhhZGVjaW1hbCAqL1xyXG4gICAgICAgICAgICAgICAgL18weFxcd3s0fVxcKCcweFtcXGRhYmNkZWZdKydcXCkvZyxcclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gXzB4OGRiNygnMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICAgICAgLyoqIG1hbmdsZWQgKi9cclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1xcKS9nLFxyXG4gICAgICAgICAgICAgICAgL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gXzB4OGRiNygnMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIGZvcihsZXQgcmVnZXggb2YgcmVnZXhwcyl7XHJcbiAgICAgICAgICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgICAgICAgICAgICAgIGlzSGFybWZ1bCA9IHJlZ2V4LnRlc3Qobm9fY29tbWVudHMpID8gXCJvYmZ1c2NhdGlvbi9oaWRkZW4gY29kZVwiIDogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZighaXNIYXJtZnVsKXJldHVyblxyXG4gICAgY2FjaGVbaGFzaF0gPSB7XHJcbiAgICAgICAgc3VzcGVjdDogdHJ1ZSxcclxuICAgICAgICBuYW1lOiBoYXNoVG9VcmxbaGFzaF0uc3BsaXQoXCIvXCIpLnBvcCgpLFxyXG4gICAgICAgIHR5cGU6IGhhc2hUb1VybFtoYXNoXS5lbmRzV2l0aChcIi5qc1wiKSA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCIsXHJcbiAgICAgICAgaGFybTogaXNIYXJtZnVsXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGBGb3VuZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgJHtjYWNoZVtoYXNoXS50eXBlLnRvTG93ZXJDYXNlKCl9OiAke2NhY2hlW2hhc2hdLm5hbWV9YClcclxuXHJcbiAgICByZW5kZXJUb0VsZW1lbnRzKGlkLCBjYWNoZVtoYXNoXSwgY2FjaGVbaGFzaF0ubmFtZSlcclxufVxyXG5cclxuY29uc3QgaGFzaFRvVXJsID0ge31cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKXtcclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpcmV0dXJuXHJcbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICBpZighYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuXHJcbiAgICBsZXQgbmV4dEhhc2ggPSAoaGFzaCwgZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKCFjYWNoZVtoYXNoXSl7XHJcbiAgICAgICAgICAgIG5vZGVGZXRjaChcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9MaWdodGNvcmQvZmlsZWhhc2hlc0BtYXN0ZXIvaGFzaGVzL1wiK2hhc2gsIHsgLy8gVXNpbmcgbm9kZS1mZXRjaCB0byBieXBhc3MgY29yc1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50IC8vIGhhdmUgdG8gc2V0IHVzZXItYWdlbnRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXJldHVybiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgaWQpXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpXHJcblxyXG4gICAgICAgICAgICAgICAgY2FjaGVbaGFzaF0gPSByZXN1bHRcclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGF0dGFjaG1lbnQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKCgpPT57fSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF1cclxuXHJcbiAgICAgICAgICAgIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYoY2FjaGUyW2F0dGFjaG1lbnQudXJsXSlyZXR1cm4gbmV4dEhhc2goY2FjaGUyW2F0dGFjaG1lbnQudXJsXSlcclxuXHJcbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxyXG4gICAgICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBhdHRhY2htZW50LnVybFxyXG5cclxuICAgICAgICAgICAgbmV4dEhhc2goaGFzaFJlc3VsdCwgZGF0YSlcclxuICAgICAgICB9KVxyXG4gICAgfSkuY2F0Y2goKCk9Pnt9KVxyXG59XHJcblxyXG5sZXQgZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdXHJcbmxldCBjaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXVxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50W119IGVsZW1lbnRzIFxyXG4gKiBAcGFyYW0ge3t0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBvZmZpY2lhbD86IGJvb2xlYW59fHtzdXNwZWN0OnRydWUsIHR5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIGhhcm06IHN0cmluZ319IHJlc3VsdFxyXG4gKi9cclxuZnVuY3Rpb24gcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBmaWxlbmFtZSl7XHJcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcclxuICAgIGlmKCFkaXYgfHwgZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMClyZXR1cm4gLy8gYWxyZWFkeSBjZXJ0aWZpZWQvZGl2IGRvZXMgbm90IGV4aXN0IGFueW1vcmUuXHJcblxyXG4gICAgaWYoIWZsb3dlclN0YXJNb2R1bGUpZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdXHJcbiAgICBpZighY2hpbGRNb2R1bGUpY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuICAgIFxyXG5cclxuICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFxyXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Ryb24ucmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChjaGlsZC5ocmVmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1zdGF0dXMtZG5kKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZSBpZighcmVzdWx0Lm9mZmljaWFsKXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMTZweFwiLGhlaWdodDpcIjE2cHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgd2FzIG1hZGUgYnkgdGhlIGRldmVsb3BlcnMgb2YgTGlnaHRjb3JkLlwiLHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCJjdXJyZW50Q29sb3JcIiwgXCJmaWxsLXJ1bGVcIjpcImV2ZW5vZGRcIixkOlwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwifSlcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1wiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIxNnB4XCIsaGVpZ2h0OlwiMTZweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNsYXNzIFBsdWdpbk1vZHVsZSB7XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cclxufVxyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcclxuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcclxuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcblxyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5vbihcImRpZC1uYXZpZ2F0ZS1pbi1wYWdlXCIsIHRoaXMuY2hhbm5lbFN3aXRjaC5iaW5kKHRoaXMpKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdGFydFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdGFydGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIHBsdWdpbiArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdG9wUGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RvcCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0b3BwZWQuYCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RvcHBlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpICsgXCIgY291bGQgbm90IGJlIHN0b3BwZWQuXCIsIGVycik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcclxuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XHJcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikge1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luKTtcclxuICAgIGVsc2UgdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpLnBsdWdpbjtcclxuICAgIHRyeSB7IGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTt9XHJcbiAgICBjYXRjaCAoZXJyKSB7aWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycl19KTt9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLWxvYWRlZFwiLCBwbHVnaW4uZ2V0TmFtZSgpKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudW5sb2FkUGx1Z2luID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xyXG4gICAgZGVsZXRlIGJkcGx1Z2luc1twbHVnaW5dO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXVubG9hZGVkXCIsIHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkUGx1Z2luKGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybiB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcclxuICAgIGNvbnN0IGVuYWJsZWQgPSBwbHVnaW5Db29raWVbcGx1Z2luXTtcclxuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBpZiAoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQgJiYgdHlwZW9mKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKCk7XHJcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXJlbG9hZGVkXCIsIHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFBsdWdpbihuYW1lKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmdWxsUGF0aCk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZVBsdWdpbkxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkUGx1Z2luKG5hbWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbkNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIsIHBsdWdpbkNvb2tpZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLm5ld01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vbk1lc3NhZ2UoKTsgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvbk1lc3NhZ2UgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5jaGFubmVsU3dpdGNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vblN3aXRjaCgpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uU3dpdGNoIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmF3T2JzZXJ2ZXIgPSBmdW5jdGlvbihlKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9ic2VydmVyKGUpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9ic2VydmVyIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBQbHVnaW5Nb2R1bGUoKTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgVjJDX1B1YmxpY1NlcnZlcnMgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgTGF5ZXIgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwiLCBpZDogXCJwdWJzbGF5ZXJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHVibGljU2VydmVycywge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCJ9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInB1YnNsYXllcnJvb3RcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXJzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpWzBdLmxheWVycy5zcGxpdChcIiBcIilbMF1cclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gRE9NLnF1ZXJ5KFwiLmxheWVycywgLlwiK2NsYXNzTmFtZUxheWVycyk7XHJcbiAgICAgICAgaWYgKCFsYXllcnMpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBsYXllcnMuYXBwZW5kKERPTS5jcmVhdGVFbGVtZW50KFwiPGRpdiBpZD0ncHVic2xheWVycm9vdCc+XCIpKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IC5sYXllcnNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBidXR0b24oKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItbGlcIiBjbGFzcz1cIiR7QkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW19XCI+YCk7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBidG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xyXG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7dGhpcy5yZW5kZXIoKTt9KTtcclxuICAgICAgICBidG4uYXBwZW5kKGxhYmVsKTtcclxuICAgICAgICByZXR1cm4gYnRuO1xyXG4gICAgfVxyXG5cclxuICAgIF9hcHBlbmRCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lU2Nyb2xsZXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlciAmJiBlLnNjcm9sbGJhcldpZHRoKVswXS5zY3JvbGxlclxyXG4gICAgICAgIF1cclxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBCRFYyLmd1aWxkQ2xhc3Nlcy53cmFwcGVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYC4ke3dyYXBwZXJ9IC4ke2NsYXNzTmFtZVNjcm9sbGVyfSA+OmZpcnN0LWNoaWxkYCk7XHJcbiAgICAgICAgRE9NLmFmdGVyKGd1aWxkcywgdGhpcy5idXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEJ1dHRvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0ID0gd2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJOYXZpZ2FibGVHdWlsZHNcIik7XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0T2xkID0gd2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZExpc3QgPyBHdWlsZExpc3QgOiBHdWlsZExpc3RPbGQucHJvdG90eXBlLCBHdWlsZExpc3QgPyBcImRlZmF1bHRcIiA6IFwicmVuZGVyXCIsIHthZnRlcjogdGhpcy5fYXBwZW5kQnV0dG9ufSk7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmd1aWxkUGF0Y2g7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKS5yZW1vdmUoKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuXHJcbmNvbnN0IEJyb3dzZXJXaW5kb3cgPSBlbGVjdHJvbi5yZW1vdGUuQnJvd3NlcldpbmRvdztcclxuY29uc3Qgd2ViQ29udGVudHMgPSBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIHJlYWN0RGV2VG9vbHMge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgbGV0IGV4dGVuc2lvblBhdGggPSBcIlwiO1xyXG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIGV4dGVuc2lvblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuTE9DQUxBUFBEQVRBLCBcIkdvb2dsZS9DaHJvbWUvVXNlciBEYXRhXCIpO1xyXG4gICAgICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwibGludXhcIikgZXh0ZW5zaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FLCBcIi5jb25maWcvZ29vZ2xlLWNocm9tZVwiKTtcclxuICAgICAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsIFwiTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L0dvb2dsZS9DaHJvbWVcIik7XHJcbiAgICAgICAgZWxzZSBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZy9jaHJvbWl1bVwiKTtcclxuICAgICAgICBleHRlbnNpb25QYXRoICs9IFwiL0RlZmF1bHQvRXh0ZW5zaW9ucy9mbWthZG1hcGdvZmFkb3BsamJqZmthcGRrb2llbmloaS9cIjtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhleHRlbnNpb25QYXRoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9ucyA9IGZzLnJlYWRkaXJTeW5jKGV4dGVuc2lvblBhdGgpO1xyXG4gICAgICAgICAgICBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGV4dGVuc2lvblBhdGgsIHZlcnNpb25zW3ZlcnNpb25zLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25QYXRoID0gZXh0ZW5zaW9uUGF0aDtcclxuICAgICAgICB0aGlzLmlzRXh0ZW5zaW9uSW5zdGFsbGVkID0gZnMuZXhpc3RzU3luYyhleHRlbnNpb25QYXRoKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyID0gdGhpcy5saXN0ZW5lci5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBzZXR0aW5nc1tcIlJlYWN0IERldlRvb2xzXCJdLmhpZGRlbiA9ICF0aGlzLmlzRXh0ZW5zaW9uSW5zdGFsbGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3RlbmVyKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0V4dGVuc2lvbkluc3RhbGxlZCkgcmV0dXJuO1xyXG4gICAgICAgIEJyb3dzZXJXaW5kb3cucmVtb3ZlRGV2VG9vbHNFeHRlbnNpb24oXCJSZWFjdCBEZXZlbG9wZXIgVG9vbHNcIik7XHJcbiAgICAgICAgY29uc3QgZGlkSW5zdGFsbCA9IEJyb3dzZXJXaW5kb3cuYWRkRGV2VG9vbHNFeHRlbnNpb24odGhpcy5leHRlbnNpb25QYXRoKTtcclxuXHJcbiAgICAgICAgaWYgKGRpZEluc3RhbGwpIFV0aWxzLmxvZyhcIlJlYWN0IERldlRvb2xzXCIsIFwiU3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCByZWFjdCBkZXZ0b29scy5cIik7XHJcbiAgICAgICAgZWxzZSBVdGlscy5lcnIoXCJSZWFjdCBEZXZUb29sc1wiLCBcIkNvdWxkbid0IGZpbmQgcmVhY3QgZGV2dG9vbHMgaW4gY2hyb21lIGV4dGVuc2lvbnMhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB3ZWJDb250ZW50cy5vbihcImRldnRvb2xzLW9wZW5lZFwiLCB0aGlzLmxpc3RlbmVyKSk7XHJcbiAgICAgICAgaWYgKHdlYkNvbnRlbnRzLmlzRGV2VG9vbHNPcGVuZWQoKSkgdGhpcy5saXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgd2ViQ29udGVudHMucmVtb3ZlTGlzdGVuZXIoXCJkZXZ0b29scy1vcGVuZWRcIiwgdGhpcy5saXN0ZW5lcik7XHJcbiAgICB9XHJcbn07ICAiLCJpbXBvcnQge3NldHRpbmdzLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIGZyb20gXCIuL3NldHRpbmdzUGFuZWxTaWRlYmFyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xyXG5pbXBvcnQgdGZIb3VyIGZyb20gXCIuLzI0aG91clwiO1xyXG5pbXBvcnQgcmVhY3REZXZUb29scyBmcm9tIFwiLi9yZWFjdERldlRvb2xzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBwdWJsaWNTZXJ2ZXJzTW9kdWxlIGZyb20gXCIuL3B1YmxpY1NlcnZlcnNcIjtcclxuaW1wb3J0IHZvaWNlTW9kZSBmcm9tIFwiLi92b2ljZU1vZGVcIjtcclxuaW1wb3J0IENsYXNzTm9ybWFsaXplciBmcm9tIFwiLi9jbGFzc05vcm1hbGl6ZXJcIjtcclxuaW1wb3J0IGRNb2RlIGZyb20gXCIuL2Rldk1vZGVcIjtcclxuXHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi4vdWkvdG9vbHNcIjtcclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuLi91aS9zY3JvbGxlclwiO1xyXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQ3NzRWRpdG9yIGZyb20gXCIuLi91aS9jc3NFZGl0b3JcIjtcclxuaW1wb3J0IENhcmRMaXN0IGZyb20gXCIuLi91aS9hZGRvbmxpc3RcIjtcclxuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4vQ3VzdG9tUmljaFByZXNlbmNlXCI7XHJcbmltcG9ydCBWMkNfQWNjb3VudEluZm9zIGZyb20gXCIuLi91aS9BY2NvdW50SW5mb3NcIjtcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBBbnRpQWRETSBmcm9tIFwiLi9BbnRpQWRETVwiO1xyXG5pbXBvcnQgYmx1clByaXZhdGUgZnJvbSBcIi4vYmx1clByaXZhdGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9TZXR0aW5nc1BhbmVsIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnNpZGVCYXJPbkNsaWNrID0gdGhpcy5zaWRlQmFyT25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyA9IHRoaXMudXBkYXRlU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBuZXcgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyKHRoaXMuc2lkZUJhck9uQ2xpY2spO1xyXG4gICAgICAgIC8vIHRoaXMuYnVpbGRQbHVnaW5Qcm9wcyA9IHRoaXMuYnVpbGRQbHVnaW5Qcm9wcy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIC8vIHRoaXMuYnVpbGRUaGVtZVByb3BzID0gdGhpcy5idWlsZFRoZW1lUHJvcHMuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dPcmlnaW5hbCA9IHRoaXMuc2hvd09yaWdpbmFsLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtc2V0dGluZ3NwYW5lLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVMYXllcixcclxuICAgICAgICAgICAgY2xhc3NTaWRlYmFyXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLnNwbGl0KFwiIFwiKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc3RhbmRhcmRTaWRlYmFyVmlldylbMF1cclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3Qgc2lkZWJhciA9IERPTS5xdWVyeShcIi5cIitjbGFzc05hbWVMYXllcitcIiAuXCIrY2xhc3NTaWRlYmFyLnN0YW5kYXJkU2lkZWJhclZpZXcuc3BsaXQoXCIgXCIpWzBdK1wiLCAuXCIrY2xhc3NOYW1lTGF5ZXIrXCIgLnVpLXN0YW5kYXJkLXNpZGViYXItdmlld1wiKTtcclxuICAgICAgICBpZiAoIXNpZGViYXIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCByb290ID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1zZXR0aW5nc3BhbmUtY29udGFpbmVyXCIgY2xhc3M9XCIke2NsYXNzU2lkZWJhci5jb250ZW50UmVnaW9ufSBjb250ZW50LXJlZ2lvblwiPmApO1xyXG4gICAgICAgIHNpZGViYXIuYXBwZW5kKHJvb3QpO1xyXG5cclxuICAgICAgICBVdGlscy5vblJlbW92ZWQocm9vdCwgKCkgPT4ge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUocm9vdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvcmVTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJjb3JlXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlnaHRjb3JkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwibGlnaHRjb3JkXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgUHJlc2VuY2VTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhcInN0YXR1c1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBNc2dMb2dTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhcIm1zZ2xvZ1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNldHRpbmdzKGNhdGVnb3J5KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdGVnb3J5ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuXHJcbiAgICBzaWRlQmFyT25DbGljayhpZCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRSZWdpb24gPSBET00ucXVlcnkoXCIuY29udGVudFJlZ2lvbi0zbkR1WXksIC5jb250ZW50LXJlZ2lvblwiKTtcclxuICAgICAgICBjb250ZW50UmVnaW9uLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB0aGlzLnJvb3Quc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiY29yZVwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDb3JlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiY3VzdG9tY3NzXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckN1c3RvbUNzc0VkaXRvcigpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwbHVnaW5zXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0aGVtZXNcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQWRkb25QYW5lKGlkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibGlnaHRjb3JkXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckxpZ2h0Y29yZFNldHRpbmdzKClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgXCJzdGF0dXNcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyUHJlc2VuY2VTZXR0aW5ncygpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlIFwiYWNjb3VudGluZm9cIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQWNjb3VudEluZm9zKClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7fVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyhpZCwgY2hlY2tlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2V0dGluZ3MoaWQsIGVuYWJsZWQpIHtcclxuICAgICAgICBzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT09IFwicmVhY3REZXZUb29sc1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZWFjdERldlRvb2xzLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgcmVhY3REZXZUb29scy5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0yXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5lbmFibGUoKVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NTdG9yZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgdHlwZW9mIGUuZGVmYXVsdCA9PT0gXCJvYmplY3RcIiAmJiBcInNob3dDdXJyZW50R2FtZVwiIGluIGUuZGVmYXVsdClbMF1cclxuICAgICAgICAgICAgICAgIGlmKHNldHRpbmdzU3RvcmUgJiYgIXNldHRpbmdzU3RvcmUuZGVmYXVsdC5zaG93Q3VycmVudEdhbWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnVwZGF0ZVJlbW90ZVNldHRpbmdzKVswXS5kZWZhdWx0LnVwZGF0ZVJlbW90ZVNldHRpbmdzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0N1cnJlbnRHYW1lOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIEN1c3RvbVJpY2hQcmVzZW5jZS5kaXNhYmxlKClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0zXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AodHJ1ZSlcclxuICAgICAgICAgICAgZWxzZSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTRcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIEFudGlBZERNLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC02XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5lbmFibGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRpYWxpemVTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWUucmVhY3REZXZUb29scykgcmVhY3REZXZUb29scy5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0yXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0zXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTRcIl0pIHZvaWNlTW9kZS5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy01XCJdKSBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgdGZIb3VyLmluamVjdDI0SG91cigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdKSBjb2xvcmVkVGV4dC5pbmplY3RDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNFwiXSkgQ2xhc3NOb3JtYWxpemVyLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTFcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMlwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLXByZXNlbmNlLTFcIl0pIEN1c3RvbVJpY2hQcmVzZW5jZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0zXCJdKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTRcIl0pIEFudGlBZERNLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTZcIl0pIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLThcIl0pIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93T3JpZ2luYWwoKSB7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMucm9vdCk7XHJcbiAgICAgICAgdGhpcy5yb290LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBET00ucXVlcnkoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudFJlZ2lvbilbMF0uY29udGVudFJlZ2lvbi5zcGxpdChcIiBcIilbMF0rXCIsIC5jb250ZW50LXJlZ2lvblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTaWRlYmFyKCkge1xyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzKj0nc2lkZS0nXSA+IFtjbGFzcyo9J2l0ZW0tJ11cIik7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRhYnMpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5zaG93T3JpZ2luYWwpO1xyXG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnNob3dPcmlnaW5hbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZW5kZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29yZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlnaHRjb3JkQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtjb250ZW50Q29sdW1uOiB0cnVlLCBmYWRlOiB0cnVlLCBkYXJrOiB0cnVlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlY3Rpb25lZFNldHRpbmdzUGFuZWwsIHtrZXk6IFwibHNwYW5uZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmxpZ2h0Y29yZFNldHRpbmdzfSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29scywge2tleTogXCJ0b29sc1wifSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHJlc2VuY2VTZXR0aW5ncywge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcImxwcGFubmVsXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogdGhpcy5QcmVzZW5jZVNldHRpbmdzXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgQWNjb3VudEluZm9zQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtjb250ZW50Q29sdW1uOiB0cnVlLCBmYWRlOiB0cnVlLCBkYXJrOiB0cnVlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJsYXBhbm5lbFwiXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VzdG9tQ3NzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtjb250ZW50Q29sdW1uOiB0cnVlLCBmYWRlOiB0cnVlLCBkYXJrOiB0cnVlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJDb3JlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvcmVDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckxpZ2h0Y29yZFNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5saWdodGNvcmRDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclByZXNlbmNlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLlByZXNlbmNlQ29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJBY2NvdW50SW5mb3MoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLkFjY291bnRJbmZvc0NvbXBvbmVudCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQ3VzdG9tQ3NzRWRpdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jdXN0b21Dc3NDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbmRlckFkZG9uUGFuZSh0eXBlKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgIC8vICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgIC8vICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvbnRlbnRDb21wb25lbnQodHlwZSksIHJvb3QpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJlbmRlckFkZG9uUGFuZSh0eXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICAgICAgICAgIEJERXZlbnRzLm9uKGAke3RoaXMucHJlZml4fS1yZWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub24oYCR7dGhpcy5wcmVmaXh9LWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub24oYCR7dGhpcy5wcmVmaXh9LXVubG9hZGVkYCwgdGhpcy5vbkNoYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgICAgICAgICBCREV2ZW50cy5vZmYoYCR7dGhpcy5wcmVmaXh9LXJlbG9hZGVkYCwgdGhpcy5vbkNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICBCREV2ZW50cy5vZmYoYCR7dGhpcy5wcmVmaXh9LWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub2ZmKGAke3RoaXMucHJlZml4fS11bmxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPT09IFwicGx1Z2luc1wiID8gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpIDogT2JqZWN0LnZhbHVlcyhiZHRoZW1lcyk7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3REb20ucmVuZGVyKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50TGlzdCwge3R5cGUsIG9uQ2hhbmdlOiB0aGlzLnNpZGVCYXJPbkNsaWNrfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZSwgbGlzdH0pKSwgdGhpcy5yb290KTtcclxuICAgIH1cclxufTtcclxuIiwiaW1wb3J0IHtiYmRDaGFuZ2Vsb2d9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFNpZGVCYXIgZnJvbSBcIi4uL3VpL3NpZGViYXJcIjtcclxuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL3VpL2ljb25zL2hpc3RvcnlcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvbkNsaWNrKSB7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gb25DbGljaztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXRlbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiTGlnaHRjb3JkIFNldHRpbmdzXCIsXHJcbiAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkJldHRlckRpc2NvcmQgU2V0dGluZ3NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImNvcmVcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJQbHVnaW5zXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJwbHVnaW5zXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiVGhlbWVzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJ0aGVtZXNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJDdXN0b20gQ1NTXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjdXN0b21jc3NcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJSaWNoUHJlc2VuY2VcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInN0YXR1c1wiXHJcbiAgICAgICAgfSwgLyp7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiTWVzc2FnZSBMb2dnZXJcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcIm1zZ2xvZ1wiXHJcbiAgICAgICAgfSwgKi97XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQWNjb3VudCBJbmZvXCIsXHJcbiAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICB9XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIC8vPFRvb2x0aXBXcmFwIGNvbG9yPVwiYmxhY2tcIiBzaWRlPVwidG9wXCIgdGV4dD17dGl0bGV9PlxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0J1dHRvbiA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2hhbmdlbG9nLWJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7VXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKGJiZENoYW5nZWxvZyk7fX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVCYXIsIHtvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssIGhlYWRlclRleHQ6IFwiQmFuZGFnZWQgQkRcIiwgaGVhZGVyQnV0dG9uOiBjaGFuZ2Vsb2dCdXR0b24sIGl0ZW1zOiB0aGlzLml0ZW1zfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLXNldHRpbmdzLXNpZGViYXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgdGFicyA9IERPTS5xdWVyeUFsbChcIltjbGFzcyo9J3NpZGUtJ10gPiBbY2xhc3MqPSdpdGVtLSddOm5vdChbY2xhc3MqPURhbmdlcl0pXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZUxvZyA9IHRhYnNbdGFicy5sZW5ndGggLSAxXTtcclxuICAgICAgICBpZiAoIWNoYW5nZUxvZykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNoYW5nZUxvZy5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXNldHRpbmdzLXNpZGViYXJcIj5gKSwgY2hhbmdlTG9nLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogW2NsYXNzKj0nc2lkZS0nXSA+IFtjbGFzcyo9J2l0ZW0tJ106bm90KFtjbGFzcyo9RGFuZ2VyXSlcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb21wb25lbnQsIHJvb3QpO1xyXG4gICAgICAgIFV0aWxzLm9uUmVtb3ZlZChyb290LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShyb290KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNsYXNzIFRoZW1lTW9kdWxlIHtcclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XHJcbn1cclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWVEYXRhKCk7XHJcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XHJcbiAgICAgICAgaWYgKCF0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgdGhlbWVDb29raWVbdGhlbWUubmFtZV0gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgdGhlbWUgaW4gdGhlbWVDb29raWUpIHtcclxuICAgICAgICBpZiAoIWJkdGhlbWVzW3RoZW1lXSkgZGVsZXRlIHRoZW1lQ29va2llW3RoZW1lXTtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IHRydWU7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGFwcGxpZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCkpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBkaXNhYmxlZC5gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGVUaGVtZSA9IGZ1bmN0aW9uKHRoZW1lKSB7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSk7XHJcbiAgICBlbHNlIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lKTtcclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1sb2FkZWRcIiwgdGhlbWUubmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudW5sb2FkVGhlbWUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGRlbGV0ZSBiZHRoZW1lc1t0aGVtZV07XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtdW5sb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICB0aGlzLnVubG9hZFRoZW1lKGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybiB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSksIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtcmVsb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKGAke2Z1bGxQYXRofWApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVwZGF0ZVRoZW1lTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xyXG4gICAgaWYgKHNhdmVkKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGVtZUNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIsIHRoZW1lQ29va2llKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBUaGVtZU1vZHVsZSgpOyIsImltcG9ydCB7YmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xyXG4gICAgLyoqIERvY3VtZW50L3dpbmRvdyB3aWR0aCAqL1xyXG4gICAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH1cclxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgaGVpZ2h0ICovXHJcbiAgICBzdGF0aWMgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2luZG93Q29uZmlnRmlsZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICAgICAgICBmcmFtZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpIHtcclxuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3RyaXBCT00oY29udGVudCkge1xyXG4gICAgICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xyXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xyXG4gICAgICAgIHJldHVybiBET00ucXVlcnkoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hhbm5lbFRleHRBcmVhICYmIGUudGl0bGVXcmFwcGVyKVswXS5jaGFubmVsVGV4dEFyZWEuc3BsaXQoXCIgXCIpWzBdK1wiIHRleHRhcmVhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0KHRleHRhcmVhLCB0ZXh0KSB7XHJcbiAgICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcclxuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxvZyhtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICMzYTcxYzE7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICMzYTcxYzE7XCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB3YXJuKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlcnIobW9kdWxlTmFtZSwgbWVzc2FnZSwgZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogcmVkOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiByZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiJWNFcnJvcjogXCIgKyBlcnJvci5tZXNzYWdlLCBcImNvbG9yOiByZWQ7XCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcclxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcclxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiA9PSB1bmRlZmluZWQgfHwgb2JqID09IFwiXCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB0aGlzLmVycihcIlN1cHByZXNzZWRFcnJvclwiLCBcIkVycm9yIG9jY3VycmVkIGluIFwiICsgbWVzc2FnZSwgZSk7IH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IHdoYXQubmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHdoYXQuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JjZSkgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge307XHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZCA9IHdoYXRbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IG9yaWdNZXRob2Q7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzT2JqZWN0OiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kQXJndW1lbnRzOiBhcmd1bWVudHMsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXRob2Q6IG9yaWdNZXRob2QsXHJcbiAgICAgICAgICAgICAgICBjYWxsT3JpZ2luYWxNZXRob2Q6ICgpID0+IGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLm9yaWdpbmFsTWV0aG9kLmFwcGx5KGRhdGEudGhpc09iamVjdCwgZGF0YS5tZXRob2RBcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnN0ZWFkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmV0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNhbGxPcmlnaW5hbE1ldGhvZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhhZnRlciwgXCJgYWZ0ZXJgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9uY2UpIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24od2hhdFttZXRob2ROYW1lXSwgb3JpZ01ldGhvZCk7XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcclxuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCkge1xyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7cmV0dXJuIG9yaWdNZXRob2QudG9TdHJpbmcoKTt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZXN0ZWRQcm9wKG9iaiwgcGF0aCkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XHJcbiAgICAgICAgfSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvd3MgYSB0b2FzdCBzaW1pbGFyIHRvIGFuZHJvaWQgdG93YXJkcyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIHN0cmluZyB0byBzaG93IGluIHRoZSB0b2FzdC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBPcHRpb25hbCBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIENoYW5nZXMgdGhlIHR5cGUgb2YgdGhlIHRvYXN0IHN0eWxpc3RpY2FsbHkgYW5kIHNlbWFudGljYWxseS4gQ2hvaWNlczogXCJcIiwgXCJpbmZvXCIsIFwic3VjY2Vzc1wiLCBcImRhbmdlclwiL1wiZXJyb3JcIiwgXCJ3YXJuaW5nXCIvXCJ3YXJuXCIuIERlZmF1bHQ6IFwiXCJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5pY29uIERldGVybWluZXMgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgc2hvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlLiBBIHRvYXN0IHdpdGhvdXQgdHlwZSB3aWxsIGFsd2F5cyBoYXZlIG5vIGljb24uIERlZmF1bHQ6IHRydWVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgQWRqdXN0cyB0aGUgdGltZSAoaW4gbXMpIHRoZSB0b2FzdCBzaG91bGQgYmUgc2hvd24gZm9yIGJlZm9yZSBkaXNhcHBlYXJpbmcgYXV0b21hdGljYWxseS4gRGVmYXVsdDogMzAwMFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyICYmIGUuaGFzTm90aWNlKVswXS5zaWRlYmFyLnNwbGl0KFwiIFwiKVs5XStcIiArIGRpdlwiKSB8fCBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBtZW1iZXJsaXN0ID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUubWVtYmVyc1dyYXApWzBdLm1lbWJlcnNXcmFwKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcImZvcm1cIikgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyID8gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAzMTA7XHJcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbWVtYmVybGlzdCA/IG1lbWJlcmxpc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgPyByaWdodCAtIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogVXRpbHMuc2NyZWVuV2lkdGggLSBsZWZ0IC0gMjQwO1xyXG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcclxuICAgICAgICAgICAgY29uc3QgdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdHNcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgbGVmdCArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcIndpZHRoXCIsIHdpZHRoICsgXCJweFwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwiYm90dG9tXCIsIGJvdHRvbSArIFwicHhcIik7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHt0eXBlID0gXCJcIiwgaWNvbiA9IHRydWUsIHRpbWVvdXQgPSAzMDAwfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0XCIpO1xyXG4gICAgICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XHJcbiAgICAgICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xyXG4gICAgICAgIHRvYXN0RWxlbS5pbm5lclRleHQgPSBjb250ZW50O1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xyXG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cclxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ke3RpdGxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29udGVudH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xyXG4gICAgICAgIGNvbnN0IGNsb3NpbmdMaXN0ZW5lcnMgPSBbXVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkNsb3NlOiAobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IHBsdWdpbkVycm9ycyA9IFtdLCB0aGVtZXM6IHRoZW1lRXJyb3JzID0gW119KSB7XHJcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMgfHwgIXRoZW1lRXJyb3JzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMubGVuZ3RoICYmICF0aGVtZUVycm9ycy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsIGJkLWNvbnRlbnQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPjxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRlbnQgRXJyb3JzPC9kaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhciBUT1BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+UGx1Z2luczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5UaGVtZXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPk5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj5NZXNzYWdlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XHJcbiAgICBcclxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVRhYihlcnJvcnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvcnNcIj5gKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPiR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+JHtlcnIubWVzc2FnZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj48YSBjbGFzcz1cImVycm9yLWxpbmtcIiBocmVmPVwiXCI+JHtlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IFwiXCJ9PC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucXVlcnlTZWxlY3RvckFsbChcImFcIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgRXJyb3IgZGV0YWlscyBmb3IgJHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9LmAsIGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgdGFicyA9IFtnZW5lcmF0ZVRhYihwbHVnaW5FcnJvcnMpLCBnZW5lcmF0ZVRhYih0aGVtZUVycm9ycyldO1xyXG4gICAgXHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtLnNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIERPTS5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgXCJzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKGUudGFyZ2V0LCBcInNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuc2Nyb2xsZXJcIik7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZCh0YWJzW0RPTS5pbmRleChlLnRhcmdldCldKTtcclxuICAgICAgICB9KSk7XHJcbiAgICBcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xyXG4gICAgICAgIGlmIChwbHVnaW5FcnJvcnMubGVuZ3RoKSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbVwiKS5jbGljaygpO1xyXG4gICAgICAgIGVsc2UgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIilbMV0uY2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IENoYW5nZWxvZ0NsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImZpeGVkXCIsIFwiaW1wcm92ZWRcIik7XHJcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XHJcbiAgICAgICAgY29uc3QgRmxleENoaWxkID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJDaGlsZFwiKTtcclxuICAgICAgICBjb25zdCBUaXRsZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIlRhZ3NcIiwgXCJkZWZhdWx0XCIpO1xyXG4gICAgICAgIGNvbnN0IENoYW5nZWxvZyA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5zZWxlY3RhYmxlID09IGZhbHNlKTtcclxuICAgICAgICBjb25zdCBNYXJrZG93blBhcnNlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZGVmYXVsdFJ1bGVzXCIsIFwicGFyc2VcIik7XHJcbiAgICAgICAgaWYgKCFDaGFuZ2Vsb2cgfHwgIU1vZGFsU3RhY2sgfHwgIUNoYW5nZWxvZ0NsYXNzZXMgfHwgIVRleHRFbGVtZW50IHx8ICFGbGV4Q2hpbGQgfHwgIVRpdGxlcyB8fCAhTWFya2Rvd25QYXJzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHtpbWFnZSA9IFwiaHR0cHM6Ly9yZXBvc2l0b3J5LWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA1NDczNTM3Lzk1N2I1NDgwLTdjMjYtMTFlOS04NDAxLTUwZmE4MjBjYmFlNVwiLCBkZXNjcmlwdGlvbiA9IFwiXCIsIGNoYW5nZXMgPSBbXSwgdGl0bGUgPSBcIkJhbmRhZ2VkQkRcIiwgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLCBmb290ZXJ9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBjZSA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dJdGVtcyA9IFtjZShcImltZ1wiLCB7c3JjOiBpbWFnZX0pXTtcclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJwXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGRlc2NyaXB0aW9uKSkpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbmdlcy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNoYW5nZXNbY107XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdID8gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA6IENoYW5nZWxvZ0NsYXNzZXMuYWRkZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbiA9IGMgPT0gMCA/IENoYW5nZWxvZ0NsYXNzZXMubWFyZ2luVG9wIDogXCJcIjtcclxuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcImgxXCIsIHtjbGFzc05hbWU6IGAke3R5cGV9ICR7bWFyZ2lufWAsfSwgZW50cnkudGl0bGUpKTtcclxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGNlKFwidWxcIiwgbnVsbCwgZW50cnkuaXRlbXMubWFwKGkgPT4gY2UoXCJsaVwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShpKSkpKTtcclxuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChsaXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVuZGVySGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LFxyXG4gICAgICAgICAgICAgICAgY2UoVGl0bGVzLmRlZmF1bHQsIHt0YWc6IFRpdGxlcy5UYWdzLkg0fSwgdGl0bGUpLFxyXG4gICAgICAgICAgICAgICAgY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJELCBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuZGF0ZX0sIHN1YnRpdGxlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICBjb25zdCByZW5kZXJGb290ZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xyXG4gICAgICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuam9pbkJEMigpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IGNlKEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBjZShcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGb290ZXIgPSBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sIGZvb3RlciA/IGZvb3RlciA6IGRlZmF1bHRGb290ZXIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKENoYW5nZWxvZywgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBfID0+IF8sXHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlOiBfID0+IF8sXHJcbiAgICAgICAgICAgICAgICByZW5kZXJIZWFkZXI6IHJlbmRlckhlYWRlcixcclxuICAgICAgICAgICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoYW5nZWxvZ0l0ZW1zXHJcbiAgICAgICAgICAgIH0sIHByb3BzKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XHJcbiAgICAgICAgY29uc3QgTWFya2Rvd24gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1hcmtkb3duXCIpO1xyXG4gICAgICAgIGNvbnN0IENvbmZpcm1hdGlvbk1vZGFsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0ua2V5ICYmIG0ua2V5KCkgPT0gXCJjb25maXJtLW1vZGFsXCIpO1xyXG4gICAgICAgIGlmICghTW9kYWxTdGFjayB8fCAhQ29uZmlybWF0aW9uTW9kYWwgfHwgIU1hcmtkb3duKSByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBlbXB0eUZ1bmN0aW9uID0gKCkgPT4ge307XHJcbiAgICAgICAgY29uc3Qge29uQ29uZmlybSA9IGVtcHR5RnVuY3Rpb24sIG9uQ2FuY2VsID0gZW1wdHlGdW5jdGlvbiwgY29uZmlybVRleHQgPSBcIk9rYXlcIiwgY2FuY2VsVGV4dCA9IFwiQ2FuY2VsXCIsIGRhbmdlciA9IGZhbHNlLCBrZXkgPSB1bmRlZmluZWR9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250ZW50ID0gW2NvbnRlbnRdO1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50Lm1hcChjID0+IHR5cGVvZihjKSA9PT0gXCJzdHJpbmdcIiA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZG93biwgbnVsbCwgYykgOiBjKTtcclxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKENvbmZpcm1hdGlvbk1vZGFsLCB7XHJcbiAgICAgICAgICAgIGhlYWRlcjogdGl0bGUsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjb250ZW50LFxyXG4gICAgICAgICAgICByZWQ6IGRhbmdlcixcclxuICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxyXG4gICAgICAgICAgICBjYW5jZWxUZXh0OiBjYW5jZWxUZXh0LFxyXG4gICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcclxuICAgICAgICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsXHJcbiAgICAgICAgfSwga2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlRGEoY2xhc3NOYW1lKXtcclxuICAgICAgICBpZighY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcclxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhZS5zdGFydHNXaXRoKFwiZGEtXCIpKS5qb2luKFwiIFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5VdGlscy5zaG93VG9hc3QgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhVdGlscy5zaG93VG9hc3QsIFwiQ291bGQgbm90IHNob3cgdG9hc3QuXCIpO1xyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlV0aWxzID0gVXRpbHMiLCJpbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMiB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuV2VicGFja01vZHVsZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUHJvdGVjdCA9IHRoZU1vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLnJlbW92ZSAmJiB0aGVNb2R1bGUuc2V0ICYmIHRoZU1vZHVsZS5jbGVhciAmJiB0aGVNb2R1bGUuZ2V0ICYmICF0aGVNb2R1bGUuc29ydCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLmdldFRva2VuIHx8IHRoZU1vZHVsZS5nZXRFbWFpbCB8fCB0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5yZW1vdmUgJiYgdGhlTW9kdWxlLnNldCAmJiB0aGVNb2R1bGUuY2xlYXIgJiYgdGhlTW9kdWxlLmdldCAmJiAhdGhlTW9kdWxlLnNvcnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGVNb2R1bGUuZ2V0VG9rZW4gJiYgIXRoZU1vZHVsZS5nZXRFbWFpbCAmJiAhdGhlTW9kdWxlLnNob3dUb2tlbikgcmV0dXJuIHRoZU1vZHVsZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoZU1vZHVsZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImdldFRva2VuXCIgfHwgcHJvcCA9PT0gXCJnZXRFbWFpbFwiIHx8IHByb3AgPT09IFwic2hvd1Rva2VuXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgZnVuYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldFRva2VuXCIpIHJldHVybiAoKSA9PiBcIm1mYS5YQ25iS3pvMENMSXFkSnpCbkwwRDhQZkRydXFrSk5IandIWHRyMzlVVTNGOGhIeDQzam9qSVN5aTVqZGpPNTJlOV9lOU1qbWFmWkZGcGMtc2VPTWFcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRFbWFpbFwiKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJzaG93VG9rZW5cIikgcmV0dXJuICgpID0+IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChmdW5jID09IFwiX19wcm90b19fXCIpIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialtmdW5jXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBwcm90ZWN0KG0uZGVmYXVsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBwcm90ZWN0KG0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0uZGVmYXVsdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVzO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5VW5pcXVlUHJvcGVydGllcyA9IChwcm9wTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IHByb3BOYW1lcy5ldmVyeShwcm9wID0+IG1vZHVsZVtwcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVByb3RvdHlwZXMgPSAocHJvdG9OYW1lcykgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLnByb3RvdHlwZSAmJiBwcm90b05hbWVzLmV2ZXJ5KHByb3RvUHJvcCA9PiBtb2R1bGUucHJvdG90eXBlW3Byb3RvUHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICB0aGlzLmludGVybmFsID0ge1xyXG4gICAgICAgICAgICByZWFjdDogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIkNvbXBvbmVudFwiLCBcIlB1cmVDb21wb25lbnRcIiwgXCJDaGlsZHJlblwiLCBcImNyZWF0ZUVsZW1lbnRcIiwgXCJjbG9uZUVsZW1lbnRcIl0pLFxyXG4gICAgICAgICAgICByZWFjdERvbTogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImZpbmRET01Ob2RlXCJdKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5nZXRJbnRlcm5hbEluc3RhbmNlID0gZSA9PiBlW09iamVjdC5rZXlzKGUpLmZpbmQoayA9PiBrLnN0YXJ0c1dpdGgoXCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZVwiKSldO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGpvaW5CRDEoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIwVG1mbzVaYk9SQ1JxYkFkXCIpO31cclxuICAgIGxlYXZlQkQxKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI4NjAwNDc0NDk2NjkxNDA0OFwiKTt9XHJcblxyXG4gICAgam9pbkJEMigpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjJIU2NtOGpcIik7fVxyXG4gICAgbGVhdmVCRDIoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjI4MDgwNjQ3MjkyODE5ODY1NlwiKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG5cclxuICAgIGdldCBhbmNob3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiXSkgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07fVxyXG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cclxuICAgIGdldCBtZXNzYWdlQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm1lc3NhZ2VcIiwgXCJjb250YWluZXJDb3p5XCJdKTt9XHJcbiAgICBnZXQgZ3VpbGRDbGFzc2VzKCkge1xyXG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ3VpbGRzRXJyb3IgJiYgZS5zZWxlY3RlZClbMF1cclxuICAgICAgICBjb25zdCBwaWxsID0gQkRNb2R1bGVzLmdldChlID0+IGUuYmxvYkNvbnRhaW5lcilbMF1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxuXHR9XHJcblxyXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XHJcbiAgICBnZXQgTWVzc2FnZUNvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJNZXNzYWdlXCIpO31cclxuICAgIGdldCBUaW1lRm9ybWF0dGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZGF0ZUZvcm1hdFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XHJcbiAgICBnZXQgTmF0aXZlTW9kdWxlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2V0QmFkZ2VcIl0pO31cclxuICAgIGdldCBJbnZpdGVBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTt9XHJcbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmhpZGUgJiYgbS5zaG93ICYmICFtLnNlYXJjaCAmJiAhbS5zdWJtaXQgJiYgIW0uc2VhcmNoICYmICFtLmFjdGl2YXRlUmFnaW5nRGVtb24gJiYgIW0uZGlzbWlzcyk7fVxyXG4gICAgZ2V0IEtleUdlbmVyYXRvcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS50b1N0cmluZyAmJiAvXCJiaW5hcnlcIi8udGVzdChtLnRvU3RyaW5nKCkpKTt9XHJcbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XHJcbiAgICBnZXQgVXNlclN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q3VycmVudFVzZXJcIl0pO31cclxuICAgIGdldCBDaGFubmVsU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuICAgIGdldCBQcml2YXRlQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZWxlY3RQcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG5cclxuICAgIG9wZW5ETSh1c2VySWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmSWQgPSB0aGlzLlVzZXJTdG9yZS5nZXRDdXJyZW50VXNlcigpLmlkO1xyXG4gICAgICAgIGlmIChzZWxmSWQgPT0gdXNlcklkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xyXG4gICAgICAgIGlmIChwcml2YXRlQ2hhbm5lbElkKSByZXR1cm4gdGhpcy5Qcml2YXRlQ2hhbm5lbEFjdGlvbnMuc2VsZWN0UHJpdmF0ZUNoYW5uZWwocHJpdmF0ZUNoYW5uZWxJZCk7XHJcbiAgICAgICAgdGhpcy5DaGFubmVsQWN0aW9ucy5vcGVuUHJpdmF0ZUNoYW5uZWwoc2VsZklkLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlU2V0dGluZ3MoY2F0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdCAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0gcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IHN0eWxlID0gYFxyXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGF0LTNiUnh4dSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNpZGViYXItMks4cEZoIHtcclxuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFZvaWNlTW9kZSB7XHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiVm9pY2VNb2RlXCIpO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbmRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbmRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBtLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKC4uLnByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5cclxubGV0IHByb2ZpbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lm9wZW4gJiYgZS5kZWZhdWx0LmZldGNoTXV0dWFsRnJpZW5kcylbMF1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0Y29yZFVzZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgZGVsZXRlIHByb3BzLmhyZWYudGFyZ2V0XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKHByb3BzKVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8cHJvcHMuQW5jaG9yIGhyZWY9e1wiL3VzZXJzL1wiK3Byb3BzLnVzZXIuaWR9IHsuLi5wcm9wcy5ocmVmfSBvbkNsaWNrPXsoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGlmKCFwcm9maWxNb2R1bGUpcHJvZmlsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQub3BlbiAmJiBlLmRlZmF1bHQuZmV0Y2hNdXR1YWxGcmllbmRzKVswXVxyXG4gICAgICAgICAgICAgICAgcHJvZmlsTW9kdWxlLmRlZmF1bHQub3Blbihwcm9wcy51c2VyLmlkKVxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi44IDFzMTIgOC4yIDcuNCAxOS43UzE2LjYgMjkgMjAgMjUuNnMtNC01LjYtOC43LTEwTDIyLjggMVwiIGZpbGw9XCJyZ2JhKDIyNyw2LDE5LC42KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvcHJvcHMuQW5jaG9yPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCdWdIdW50ZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOCAxczEyIDguMiA3LjQgMTkuN1MxNi42IDI5IDIwIDI1LjZzLTQtNS42LTguNy0xMEwyMi44IDFcIiBmaWxsPVwicmdiYSgyMjcsNiwxOSwuNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkTG9nbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTY4IDE2OC42OVwiIHsuLi5wcm9wc30gaGVpZ2h0PVwiMTAwJVwiIHdpZHRoPXtwcm9wcy5zaXplfT5cclxuICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYVwiIHgxPXs2Ni43fSB5MT17LTQ4Ny43fSB4Mj17NjYuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTE0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYlwiIHgxPXsxMDEuN30geTE9ey00ODcuN30geDI9ezEwMS43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMjA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19jXCIgeDE9ezg0fSB5MT17LTQwOH0geDI9ezg0fSB5Mj17LTU3Ni42OX0gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNMTQuOSAzNS4zaDEzOS4yVjEzM0gxNC45elwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTY2LjcgNzkuN2MtNS40IDAtOS44IDQuNy05LjggMTAuNXM0LjQgMTAuNSA5LjggMTAuNSA5LjgtNC43IDkuOC0xMC41LTQuNC0xMC41LTkuOC0xMC41elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMDEuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19iKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMHYxNjhsMTY4IC42OVYwem0xMTEuMyAxMjQuMXMtMy40LTQuMS02LjMtNy43YzEyLjYtMy41IDE3LjQtMTEuMyAxNy40LTExLjNhNTIuNTIgNTIuNTIgMCAwMS0xMS4xIDUuNiA2OC42MyA2OC42MyAwIDAxLTM4LjkgNCA3MC4xMiA3MC4xMiAwIDAxLTE0LjEtNC4xIDQ4Ljg4IDQ4Ljg4IDAgMDEtNy4xLTMuM2MtLjMtLjItLjYtLjMtLjktLjVhLjc2Ljc2IDAgMDAtLjQtLjJjLTEuNy0xLTIuNi0xLjYtMi42LTEuNnM0LjYgNy42IDE2LjggMTEuMmMtMi45IDMuNi02LjQgNy45LTYuNCA3LjktMjEuMi0uNi0yOS4zLTE0LjUtMjkuMy0xNC41IDAtMzAuNiAxMy44LTU1LjQgMTMuOC01NS40IDEzLjgtMTAuMyAyNi45LTEwIDI2LjktMTBsMSAxLjFDNTIuOCA1MC4zIDQ1IDU3LjkgNDUgNTcuOWE1Ni4yIDU2LjIgMCAwMTUuNy0yLjcgNzIuMTkgNzIuMTkgMCAwMTIxLjgtNiA4Ljc1IDguNzUgMCAwMTEuNi0uMiA4OS4xIDg5LjEgMCAwMTE5LjQtLjIgNzguNDUgNzguNDUgMCAwMTI4LjkgOS4xcy03LjUtNy4yLTIzLjktMTIuMWwxLjMtMS41czEzLjEtLjMgMjYuOSAxMGMwIDAgMTMuOCAyNC44IDEzLjggNTUuNC4xLS4xLTggMTMuOC0yOS4yIDE0LjR6XCIgZmlsbD1cInVybCgjcHJlZml4X19jKVwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBkYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4uL21vZHVsZXMvQ3VzdG9tUmljaFByZXNlbmNlXCJcclxuaW1wb3J0IFNlbGVjdCBmcm9tIFwiLi9zZWxlY3RcIjtcclxuaW1wb3J0IHRpbWVzdGFtcFJlbmRlciBmcm9tIFwiLi90aW1lc3RhbXBSZW5kZXJcIlxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0XCIpfVxyXG4gKi9cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG5sZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxubGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxubGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbmxldCBzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuY29uc3QgR3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMpWzBdLmRlZmF1bHRcclxuY29uc3QgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UmVsYXRpb25zaGlwcylbMF0uZGVmYXVsdFxyXG5jb25zdCBzZXNzaW9uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0U2Vzc2lvbnMpWzBdLmRlZmF1bHRcclxuY29uc3QgdXNlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQWNjb3VudEluZm9zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZighY29udGVudE1vZHVsZSljb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICBpZighbWFyZ2luTW9kdWxlMiltYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG4gICAgICAgIGlmKCFjb2xvck1vZHVsZSljb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbiAgICAgICAgaWYoIXNpemVNb2R1bGUpc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9XHJcbiAgICAgICAgICAgIHN0eWxlPXt7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiQWNjb3VudCBJbmZvc1wiLz5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0UHJvZmlsZVZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U3RhdGlzdGljcygpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RlZCBTZXNzaW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U2Vzc2lvblZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0ubWFyZ2luQm90dG9tMjB9PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXNzaW9uVmFsdWUoKXtcclxuICAgICAgICBjb25zdCBzZXNzaW9uc1JhdyA9IHNlc3Npb25Nb2R1bGUuZ2V0U2Vzc2lvbnMoKVxyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zID0gT2JqZWN0LmtleXMoc2Vzc2lvbnNSYXcpLmZpbHRlcihlID0+IGUgIT09IFwiYWxsXCIpLm1hcChlID0+IHNlc3Npb25zUmF3W2VdKVxyXG5cclxuICAgICAgICBpZihzZXNzaW9ucy5sZW5ndGggPT09IDApcmV0dXJuIFwiLSBObyBzZXNzaW9uIGRldGVjdGVkLiBQbGVhc2UgdHJ5IGluIGEgZmV3IHNlY29uZHNcIlxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBzZXNzaW9ucy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBgKyBpZDogJHtlLnNlc3Npb25JZH1cclxuKyBvczogJHtlLmNsaWVudEluZm8ub3NbMF0udG9VcHBlckNhc2UoKStlLmNsaWVudEluZm8ub3Muc2xpY2UoMSl9XHJcbisgY2xpZW50OiAke2UuY2xpZW50SW5mby5jbGllbnR9XHJcbisgc3RhdHVzOiAke2Uuc3RhdHVzfVxyXG4rIGFjdGl2ZTogJHtlLmFjdGl2ZSA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcclxuICAgICAgICB9KS5qb2luKFwiXFxuXCIrXCItXCIucmVwZWF0KDM4KStcIlxcblwiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVWYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RGF0ZX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxyXG5cclxuICAgICAgICByZXR1cm4gYCsgVXNlcm5hbWU6ICR7dXNlci51c2VybmFtZX1cclxuKyBEaXNjcmltaW5hdG9yOiAke3VzZXIuZGlzY3JpbWluYXRvcn1cclxuKyBUYWc6ICR7dXNlci50YWd9XHJcbisgSUQ6ICR7dXNlci5pZH1cclxuKyBBdmF0YXI6ICR7dXNlci5hdmF0YXJ9XHJcbisgQXZhdGFyIFVSTDogaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXZhdGFycy8ke3VzZXIuaWR9LyR7dXNlci5hdmF0YXJ9LiR7dXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCJ9P3NpemU9NDA5NlxyXG4rIENyZWF0aW9uIERhdGU6ICR7KGNyZWF0ZWRBdC5nZXREYXRlKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0TW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldEZ1bGxZZWFyKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfSAke2NyZWF0ZWRBdC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWggJHtjcmVhdGVkQXQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfW1pbiAke2NyZWF0ZWRBdC5nZXRTZWNvbmRzKCl9c1xyXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XHJcbisgSGFzIE5pdHJvOiAke3VzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gRW1haWw6ICR7dXNlci5lbWFpbH1cclxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIFBob25lOiAke3VzZXIucGhvbmUgfHwgXCJOb25lXCJ9XHJcbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1gXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdGlzdGljcygpe1xyXG5cclxuICAgICAgICBjb25zdCBndWlsZHMgPSBPYmplY3QudmFsdWVzKEd1aWxkTW9kdWxlLmdldEd1aWxkcygpKVxyXG4gICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IE9iamVjdC5rZXlzKHJlbGF0aW9uU2hpcE1vZHVsZS5nZXRSZWxhdGlvbnNoaXBzKCkpXHJcbiAgICAgICAgY29uc3QgZnJpZW5kcyA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNGcmllbmQoZSkpXHJcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNCbG9ja2VkKGUpKVxyXG5cclxuICAgICAgICByZXR1cm4gYCsgU2VydmVyIENvdW50OiAke2d1aWxkcy5sZW5ndGh9IHNlcnZlcnNcclxuKyBSZWxhdGlvbnM6ICR7cmVsYXRpb25zLmxlbmd0aH0gcmVsYXRpb25zXHJcbisgRnJpZW5kcyBDb3VudDogJHtmcmllbmRzLmxlbmd0aH0gZnJpZW5kc1xyXG4tIEJsb2NrZWQgVXNlcnMgQ291bnQ6ICR7YmxvY2tlZC5sZW5ndGh9IGJsb2NrZWQgdXNlcnNgXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5sZXQgaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG5cclxuY2xhc3MgQ29kZUNvbnRlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUxKW1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMiltZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG4gICAgICAgIGlmKCFzY3JvbGxiYXJNb2R1bGUxKXNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG4gICAgICAgIGlmKCFoaWdodGxpZ2h0SlMpaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7bWVzc2FnZU1vZHVsZTEubWFya3VwfSAke21lc3NhZ2VNb2R1bGUyLm1lc3NhZ2VDb250ZW50fWB9PlxyXG4gICAgICAgICAgICA8cHJlPlxyXG4gICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9e2Ake3Njcm9sbGJhck1vZHVsZTEuc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gaGxqc2B9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBoaWdodGxpZ2h0SlMuaGlnaGxpZ2h0KHRoaXMucHJvcHMubGFuZ3VhZ2UsIHRoaXMucHJvcHMuY29udGVudCkudmFsdWV9fT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2NvZGU+XHJcbiAgICAgICAgICAgIDwvcHJlPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcclxuaW1wb3J0IERlbGV0ZUljb24gZnJvbSBcIi4vaWNvbnMvZGVsZXRlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcbmNvbnN0IGFuY2hvckNsYXNzZXMgPSBCRFYyLmFuY2hvckNsYXNzZXM7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUGx1Z2luQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5oYXNTZXR0aW5ncyA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luICYmIHR5cGVvZih0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKSA9PT0gXCJmdW5jdGlvblwiO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdCA9IHRoaXMuZWRpdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlID0gdGhpcy5kZWxldGUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlbG9hZCA9IHRoaXMucmVsb2FkLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuZW5hYmxlZCxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IGZhbHNlLFxyXG4gICAgICAgICAgICByZWxvYWRzOiAwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IChjb250YWluZXIsIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY0JvdHRvbSA9IGNUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZVRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgKGVUb3AgPCBjVG9wIHx8IGVCb3R0b20gPiBjQm90dG9tKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5yZWZzLmNhcmROb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzTm9kZS5jbG9zZXN0KFwiLnNjcm9sbGVyXCIpO1xyXG4gICAgICAgICAgICBpZiAoIWlzSGlkZGVuKGNvbnRhaW5lciwgdGhpc05vZGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlT2Zmc2V0ID0gRE9NLm9mZnNldCh0aGlzTm9kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck9mZnNldCA9IERPTS5vZmZzZXQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXNOb2RlT2Zmc2V0LnRvcCAtIGNvbnRhaW5lck9mZnNldC50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wIC0gMzA7XHJcbiAgICAgICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFBvaW50ID4gb3JpZ2luYWwpIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCArIChwcm9ncmVzcyAqIChlbmRQb2ludCAtIG9yaWdpbmFsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgLSAocHJvZ3Jlc3MgKiAob3JpZ2luYWwgLSBlbmRQb2ludCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nc0NvbXBvbmVudCgpIHtcclxuICAgICAgICB0cnkgeyB0aGlzLnNldHRpbmdzUGFuZWwgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKCk7IH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZ2V0IHNldHRpbmdzIHBhbmVsIGZvciBcIiArIHRoaXMubmFtZSArIFwiLlwiLCBlcnIpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3Mtb3BlbiB1aS1zd2l0Y2gtaXRlbVwiLCByZWY6IFwiY2FyZE5vZGVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XCJmbG9hdFwiOiBcInJpZ2h0XCIsIFwiY3Vyc29yXCI6IFwicG9pbnRlclwifSwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsID09PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwifSksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgIT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCIsIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7X19odG1sOiB0aGlzLnNldHRpbmdzUGFuZWx9fSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKSB7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSBcInt7bmFtZX19IHZ7e3ZlcnNpb259fSBieSB7e2F1dGhvcn19XCIuc3BsaXQoLyh7e1tBLVphLXpdK319KS8pO1xyXG4gICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e25hbWV9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVtuYW1lSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJuYW1lIGJkYS1uYW1lXCJ9LCBuYW1lKTtcclxuICAgICAgICBjb25zdCB2ZXJzaW9uSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3t2ZXJzaW9ufX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbdmVyc2lvbkluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwidmVyc2lvbiBiZGEtdmVyc2lvblwifSwgdmVyc2lvbik7XHJcbiAgICAgICAgY29uc3QgYXV0aG9ySW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3thdXRob3J9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJhdXRob3IgYmRhLWF1dGhvclwifTtcclxuICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCkge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuY2xhc3NOYW1lICs9IGAgJHthbmNob3JDbGFzc2VzLmFuY2hvcn0gJHthbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YDtcclxuICAgICAgICAgICAgICAgIHByb3BzLnRhcmdldCA9IFwiX2JsYW5rXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rKSBwcm9wcy5ocmVmID0gYXV0aG9yLmxpbms7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmlkKSBwcm9wcy5vbkNsaWNrID0gKCkgPT4ge0JEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpOyBCRFYyLm9wZW5ETShhdXRob3IuaWQpO307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGl0bGVbYXV0aG9ySW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChhdXRob3IubGluayB8fCBhdXRob3IuaWQgPyBcImFcIiA6IFwic3BhblwiLCBwcm9wcywgYXV0aG9yLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGl0bGUuZmxhdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VMaW5rKHRpdGxlLCB1cmwpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYmRhLWxpbmsgYmRhLWxpbmstd2Vic2l0ZVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9O1xyXG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcInN0cmluZ1wiKSBwcm9wcy5ocmVmID0gdXJsO1xyXG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcImZ1bmN0aW9uXCIpIHByb3BzLm9uQ2xpY2sgPSAoZXZlbnQpID0+IHtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdXJsKCk7fTtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBwcm9wcywgdGl0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VCdXR0b24odGl0bGUsIGNoaWxkcmVuLCBhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gPFRvb2x0aXBXcmFwIGNvbG9yPVwiYmxhY2tcIiBzaWRlPVwidG9wXCIgdGV4dD17dGl0bGV9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWJ1dHRvblwiIG9uQ2xpY2s9e2FjdGlvbn0+e2NoaWxkcmVufTwvZGl2PlxyXG4gICAgICAgIDwvVG9vbHRpcFdyYXA+O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaW5rcygpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBpZiAoYWRkb24ud2Vic2l0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiV2Vic2l0ZVwiLCBhZGRvbi53ZWJzaXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnNvdXJjZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU291cmNlXCIsIGFkZG9uLnNvdXJjZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcclxuICAgICAgICAgICAgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU3VwcG9ydCBTZXJ2ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdGVyID0gL1xcLmdnXFwvKC4qKSQvO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyLnRlc3QoY29kZSkpIGNvZGUgPSBjb2RlLm1hdGNoKHRlc3RlcilbMV07XHJcbiAgICAgICAgICAgICAgICBCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24ucGF0cmVvbikgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiUGF0cmVvblwiLCBhZGRvbi5wYXRyZW9uKSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xyXG4gICAgICAgIHJldHVybiAobGlua3MubGVuZ3RoIHx8IHRoaXMuaGFzU2V0dGluZ3MpICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtZm9vdGVyIGJkYS1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1saW5rcyBiZGEtbGlua3NcIn0sXHJcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmhhc1NldHRpbmdzICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7b25DbGljazogdGhpcy5zaG93U2V0dGluZ3MsIGNsYXNzTmFtZTogXCJiZC1idXR0b24gYmRhLXNldHRpbmdzLWJ1dHRvblwiLCBkaXNhYmxlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0sIFwiU2V0dGluZ3NcIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMudG9nZ2xlICYmIHRoaXMucHJvcHMudG9nZ2xlKHRoaXMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQoKSB7dGhpcy5wcm9wcy5lZGl0KHRoaXMubmFtZSk7fVxyXG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxyXG4gICAgcmVsb2FkKCkge3RoaXMucHJvcHMucmVsb2FkKHRoaXMubmFtZSk7fVxyXG5cclxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0IGF1dGhvcigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IHRoaXMucHJvcHMuYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IHRoaXMucHJvcHMuYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3Qge2F1dGhvcklkLCBhdXRob3JMaW5rfSA9IHRoaXMucHJvcHMuYWRkb247XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3MtY2xvc2VkIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1oZWFkZXIgYmRhLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLXRpdGxlIGJkYS1oZWFkZXItdGl0bGVcIn0sIHRoaXMuYnVpbGRUaXRsZSh0aGlzLm5hbWUsIHRoaXMudmVyc2lvbiwge25hbWU6IHRoaXMuYXV0aG9yLCBpZDogYXV0aG9ySWQsIGxpbms6IGF1dGhvckxpbmt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmVkaXQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRWRpdFwiLCA8RWRpdEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmVkaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSAmJiB0aGlzLm1ha2VCdXR0b24oXCJEZWxldGVcIiwgPERlbGV0ZUljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmRlbGV0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkfSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyLXdyYXAgYmRhLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXIgYmQtYWRkb24tZGVzY3JpcHRpb24gYmRhLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCB0aGlzLmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmZvb3RlclxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xyXG5pbXBvcnQgQ29udGVudENvbHVtbiBmcm9tIFwiLi9jb250ZW50Q29sdW1uXCI7XHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi90b29sc1wiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBBZGRvbkNhcmQgZnJvbSBcIi4vYWRkb25jYXJkXCI7XHJcbmltcG9ydCBTY3JvbGxlciBmcm9tIFwiLi9zY3JvbGxlclwiO1xyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4vY29tcG9uZW50cy9kcm9wZG93blwiO1xyXG5pbXBvcnQgU2VhcmNoIGZyb20gXCIuL2NvbXBvbmVudHMvc2VhcmNoXCI7XHJcblxyXG5pbXBvcnQge3NldHRpbmdzQ29va2llLCBwbHVnaW5Db29raWUsIHRoZW1lQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuLi9tb2R1bGVzL2JkQXBpXCI7XHJcblxyXG5jb25zdCBUb29sdGlwID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLnJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FyZExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7c29ydDogXCJuYW1lXCIsIGFzY2VuZGluZzogdHJ1ZSwgcXVlcnk6IFwiXCJ9O1xyXG4gICAgICAgIHRoaXMuaXNQbHVnaW5zID0gdGhpcy5wcm9wcy50eXBlID09IFwicGx1Z2luc1wiO1xyXG4gICAgICAgIHRoaXMuY29va2llID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Db29raWUgOiB0aGVtZUNvb2tpZTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbk1vZHVsZSA6IHRoZW1lTW9kdWxlO1xyXG5cclxuICAgICAgICB0aGlzLnNvcnQgPSB0aGlzLnNvcnQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJldmVyc2UgPSB0aGlzLnJldmVyc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb3BlbkZvbGRlcigpIHtcclxuICAgICAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0odGhpcy5pc1BsdWdpbnMgPyBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KG5hbWUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZShuYW1lKTtcclxuICAgICAgICBpZiAoIXNob3VsZERlbGV0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJBcmUgWW91IFN1cmU/XCIsIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7bmFtZX0/YCwge1xyXG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRGVsZXRlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtyZXNvbHZlKHRydWUpO30sXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJOYW1lXCIsIHZhbHVlOiBcIm5hbWVcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBdXRob3JcIiwgdmFsdWU6IFwiYXV0aG9yXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiUmVjZW50bHkgQWRkZWRcIiwgdmFsdWU6IFwiYWRkZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJMYXN0IE1vZGlmaWVkXCIsIHZhbHVlOiBcIm1vZGlmaWVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlyZWN0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkRlc2NlbmRpbmdcIiwgdmFsdWU6IGZhbHNlfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJzZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c29ydDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2goZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtxdWVyeTogZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9wcyhhZGRvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy5nZXROYW1lKGFkZG9uKSxcclxuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb29raWVbdGhpcy5nZXROYW1lKGFkZG9uKV0sXHJcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXHJcbiAgICAgICAgICAgIC8vZWRpdDogdGhpcy5lZGl0LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIHJlbW92ZTogdGhpcy5kZWxldGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgYWRkb246IGFkZG9uXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCI/Pz9cIjtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWRkb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZEFkZG9ucyA9IHRoaXMucHJvcHMubGlzdC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IHRoaXMuc3RhdGUuc29ydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3RhdGUuc29ydC5zbGljZSgxKTtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhLnBsdWdpbiAmJiBhLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhhLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgOiBhW3RoaXMuc3RhdGUuc29ydF07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiBiW3RoaXMuc3RhdGUuc29ydF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdC50b0xvY2FsZUxvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoc2Vjb25kLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICBpZiAoZmlyc3QgPiBzZWNvbmQpIHJldHVybiAxO1xyXG4gICAgICAgICAgICBpZiAoc2Vjb25kID4gZmlyc3QpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmFzY2VuZGluZykgc29ydGVkQWRkb25zLnJldmVyc2UoKTtcclxuICAgICAgICBjb25zdCByZW5kZXJlZCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgc29ydGVkQWRkb25zLmxlbmd0aDsgYSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uID0gc29ydGVkQWRkb25zW2FdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5xdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZShhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldEF1dGhvcihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuZ2V0RGVzY3JpcHRpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuZ2V0VmVyc2lvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkgbWF0Y2hlcyA9IG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IpIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGF1dGhvci50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBkZXNjcmlwdGlvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IHZlcnNpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcykgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKGFkZG9uKTtcclxuICAgICAgICAgICAgcmVuZGVyZWQucHVzaCg8RXJyb3JCb3VuZGFyeT48QWRkb25DYXJkIHsuLi5wcm9wc30gcmVsb2FkPXshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgdGhpcy5tYW5hZ2VyLnJlbG9hZC5iaW5kKHRoaXMubWFuYWdlcil9IC8+PC9FcnJvckJvdW5kYXJ5Pik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZW5kZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXROYW1lKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXROYW1lKCkgOiBhZGRvbi5uYW1lKTt9XHJcbiAgICBnZXRBdXRob3IoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXREZXNjcmlwdGlvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IGFkZG9uLmRlc2NyaXB0aW9uKTt9XHJcbiAgICBnZXRWZXJzaW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRWZXJzaW9uKCkgOiBhZGRvbi52ZXJzaW9uKTt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hJY29uID0gPFRvb2x0aXAgY29sb3I9XCJibGFja1wiIHBvc2l0aW9uPVwidG9wXCIgdGV4dD1cIlJlbG9hZCBMaXN0XCI+XHJcbiAgICAgICAgICAgIHsocHJvcHMpID0+IFxyXG4gICAgICAgICAgICA8UmVsb2FkSWNvbiB7Li4ucHJvcHN9IGNsYXNzTmFtZT1cImJkLWljb24gYmQtcmVsb2FkIGJkLXJlbG9hZC1oZWFkZXJcIiBzaXplPVwiMThweFwiIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGx1Z2lucykgcGx1Z2luTW9kdWxlLnVwZGF0ZVBsdWdpbkxpc3QoKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhlbWVNb2R1bGUudXBkYXRlVGhlbWVMaXN0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH19IC8+XHJcbiAgICAgICAgICAgIH08L1Rvb2x0aXA+O1xyXG4gICAgICAgIGNvbnN0IGFkZG9uQ2FyZHMgPSB0aGlzLmdldEFkZG9ucygpO1xyXG5cclxuICAgICAgICByZXR1cm4gPFNjcm9sbGVyIGNvbnRlbnRDb2x1bW49e3RydWV9IGZhZGU9e3RydWV9IGRhcms9e3RydWV9PlxyXG4gICAgICAgICAgICAgICAgPENvbnRlbnRDb2x1bW4gdGl0bGU9e2Ake3RoaXMucHJvcHMudHlwZS50b1VwcGVyQ2FzZSgpfeKAlCR7YWRkb25DYXJkcy5sZW5ndGh9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBrZXk9XCJmb2xkZXItYnV0dG9uXCIgY2xhc3NOYW1lPVwiYmQtYnV0dG9uIGJkLXBmYnRuXCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9Pk9wZW4ge3RoaXMuaXNQbHVnaW5zID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIn0gRm9sZGVyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgeyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiByZWZyZXNoSWNvbn1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWNvbnRyb2xzIGJkLWFkZG9uLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWFyY2ggb25DaGFuZ2U9e3RoaXMuc2VhcmNofSBwbGFjZWhvbGRlcj17YFNlYXJjaCAke3RoaXMucHJvcHMudHlwZX0uLi5gfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWRyb3Bkb3duc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPlNvcnQgYnk6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5zb3J0T3B0aW9uc30gb25DaGFuZ2U9e3RoaXMuc29ydH0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5PcmRlcjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLmRpcmVjdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnJldmVyc2V9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZGEtc2xpc3QgYmQtYWRkb24tbGlzdFwiPnthZGRvbkNhcmRzfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Db250ZW50Q29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPFRvb2xzIGtleT1cInRvb2xzXCIgLz5cclxuICAgICAgICAgICAgPC9TY3JvbGxlcj47XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ2FyZExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENhcmRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRExvZ28gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7aGVpZ2h0OiBcIjEwMCVcIiwgd2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ28gXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSwgc3R5bGU6IHtmaWxsUnVsZTogXCJldmVub2RkXCIsIGNsaXBSdWxlOiBcImV2ZW5vZGRcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwifSwgdmlld0JveDogXCIwIDAgMjAwMCAyMDAwXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtZXRhZGF0YVwiLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cxXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIyMFwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDAsMCwwLDAuMzUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjE1XCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMjU1LDI1NSwyNTUsMC4xNSlcIn0pKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93M1wifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MylcIn0sIGQ6IFwiTTExOTUuNDQrMTM1LjQ0MkwxMTk1LjQ0KzEzNS40NDJMOTk3LjYrMTM2LjQ0MkMxMDI0LjIrMTQ5Ljc0MisxMTcwLjM0KzE2My41NDIrMTE5My42NCsxNzkuNzQyQzEyNjQuMzQrMjI4Ljg0MisxMzE5Ljc0KzI5MS4yNDIrMTM1OC4yNCszNjUuMDQyQzEzOTguMTQrNDQxLjY0MisxNDE5Ljc0KzUzMC42NDIrMTQyMi41NCs2MjkuNjQyTDE0MjIuNTQrNjMwLjg0MkwxNDIyLjU0KzYzMi4wNDJDMTQyMi41NCs3NzMuMTQyKzE0MjIuNTQrMTIyOC4xNCsxNDIyLjU0KzEzNjkuMTRMMTQyMi41NCsxMzcwLjM0TDE0MjIuNTQrMTM3MS41NEMxNDE5Ljg0KzE0NzAuNTQrMTM5OC4yNCsxNTU5LjU0KzEzNTguMjQrMTYzNi4xNEMxMzE5Ljc0KzE3MDkuOTQrMTI2NC40NCsxNzcyLjM0KzExOTMuNjQrMTgyMS40NEMxMTcxLjA0KzE4MzcuMTQrMTAyNS43KzE4NTAuNTQrMTAwMCsxODYzLjU0TDExOTMuNTQrMTg2NC41NEMxNTM5Ljc0KzE4NjYuNDQrMTg2NC41NCsxNjkzLjM0KzE4NjQuNTQrMTI5Ni42NEwxODY0LjU0KzcxNi45NDJDMTg2Ni40NCszMTIuNDQyKzE1NDEuNjQrMTM1LjQ0MisxMTk1LjQ0KzEzNS40NDJaXCIsIGZpbGw6IFwiIzE3MTcxN1wiLCBvcGFjaXR5OiBcIjFcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cyKVwifSwgZDogXCJNMTY5NS41NCs2MzEuNDQyQzE2ODUuODQrMjc4LjA0MisxNDA5LjM0KzEzNS40NDIrMTA1Mi45NCsxMzUuNDQyTDM2MS43NCsxMzYuNDQyTDgwMy43NCs0OTAuNDQyTDEwNjAuNzQrNDkwLjQ0MkMxMzM1LjI0KzQ5MC40NDIrMTMzNS4yNCs4MzUuMzQyKzEwNjAuNzQrODM1LjM0MkwxMDYwLjc0KzExNjQuODRDMTE1MC4yMisxMTY0Ljg0KzEyMTAuNTMrMTIwMS40OCsxMjQxLjY4KzEyNTAuODdDMTMwNi4wNysxMzUzKzEyNDUuNzYrMTUwOS42NCsxMDYwLjc0KzE1MDkuNjRMMzYxLjc0KzE4NjMuNTRMMTA1Mi45NCsxODY0LjU0QzE0MDkuMjQrMTg2NC41NCsxNjg1Ljc0KzE3MjEuOTQrMTY5NS41NCsxMzY4LjU0QzE2OTUuNTQrMTIwNS45NCsxNjUxLjA0KzEwODQuNDQrMTU3Mi42NCs5OTkuOTQyQzE2NTEuMDQrOTE1LjU0MisxNjk1LjU0Kzc5NC4wNDIrMTY5NS41NCs2MzEuNDQyWlwiLCBmaWxsOiBcIiMzRTgyRTVcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MSlcIn0sIGQ6IFwiTTE0NjkuMjUrNjMxLjQ0MkMxNDU5LjU1KzI3OC4wNDIrMTE4My4wNSsxMzUuNDQyKzgyNi42NSsxMzUuNDQyTDEzNS40NSsxMzUuNDQyTDEzNS40NSsxMDA0QzEzNS40NSsxMDA0KzEzNS40MjcrMTI1NS4yMSszNTUuNjI2KzEyNTUuMjFDNTc1LjgyNSsxMjU1LjIxKzU3NS44NDgrMTAwNCs1NzUuODQ4KzEwMDRMNTc3LjQ1KzQ5MC40NDJMODM0LjQ1KzQ5MC40NDJDMTEwOC45NSs0OTAuNDQyKzExMDguOTUrODM1LjM0Mis4MzQuNDUrODM1LjM0Mkw2NjQuNjUrODM1LjM0Mkw2NjQuNjUrMTE2NC44NEw4MzQuNDUrMTE2NC44NEM5MjMuOTMyKzExNjQuODQrOTg0LjI0NCsxMjAxLjQ4KzEwMTUuMzkrMTI1MC44N0MxMDc5Ljc4KzEzNTMrMTAxOS40NysxNTA5LjY0KzgzNC40NSsxNTA5LjY0TDEzNS40NSsxNTA5LjY0TDEzNS40NSsxODY0LjU0TDgyNi42NSsxODY0LjU0QzExODIuOTUrMTg2NC41NCsxNDU5LjQ1KzE3MjEuOTQrMTQ2OS4yNSsxMzY4LjU0QzE0NjkuMjUrMTIwNS45NCsxNDI0Ljc1KzEwODQuNDQrMTM0Ni4zNSs5OTkuOTQyQzE0MjQuNzUrOTE1LjU0MisxNDY5LjI1Kzc5NC4wNDIrMTQ2OS4yNSs2MzEuNDQyWlwiLCBmaWxsOiBcIiNGRkZGRkZcIiwgb3BhY2l0eTogXCIxXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ2hlY2tib3ggZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwibGlcIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3ggXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtaW5uZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hJbm5lcilbMF0uY2hlY2tib3hJbm5lcn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveEVsZW1lbnQsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZCwgb25DaGFuZ2U6ICgpID0+IHt9LCB0eXBlOiBcImNoZWNrYm94XCJ9KSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCAhdGhpcy5zdGF0ZS5jaGVja2VkKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgY2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IEFycm93IGZyb20gXCIuLi9pY29ucy9kb3duYXJyb3dcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlY3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtvcGVuOiBmYWxzZSwgdmFsdWU6IHRoaXMucHJvcHMudmFsdWUgfHwgdGhpcy5wcm9wcy5vcHRpb25zWzBdLnZhbHVlfTtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duID0gUmVhY3QuY3JlYXRlUmVmKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dNZW51ID0gdGhpcy5zaG93TWVudS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGlkZU1lbnUgPSB0aGlzLmhpZGVNZW51LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd01lbnUoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe29wZW46IHRydWV9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlTWVudSgpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiBmYWxzZX0sICgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7dmFsdWV9KTtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNoYW5nZSkgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGVkKCkge3JldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT0gdGhpcy5zdGF0ZS52YWx1ZSk7fVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZDtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcChvcHQgPT4gXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdC1vcHRpb24ke3NlbGVjdGVkLnZhbHVlID09IG9wdC52YWx1ZSA/IFwiIHNlbGVjdGVkXCIgOiBcIlwifWB9IG9uQ2xpY2s9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzLCBvcHQudmFsdWUpfT57b3B0LmxhYmVsfTwvZGl2PlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLnByb3BzLnN0eWxlID09IFwidHJhbnNwYXJlbnRcIiA/IFwiIGJkLXNlbGVjdC10cmFuc3BhcmVudFwiIDogXCJcIjtcclxuICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLnN0YXRlLm9wZW4gPyBcIiBtZW51LW9wZW5cIiA6IFwiXCI7XHJcbiAgICAgICAgcmV0dXJuICA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdCR7c3R5bGV9JHtpc09wZW59YH0gb25DbGljaz17dGhpcy5zaG93TWVudX0gcmVmPXt0aGlzLmRyb3Bkb3dufT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC12YWx1ZVwiPnt0aGlzLnNlbGVjdGVkLmxhYmVsfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcFwiPlxyXG4vLyA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj57dGhpcy5wcm9wcy5sYWJlbH08L2xhYmVsPlxyXG4vLyA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdCR7c3R5bGV9JHtpc09wZW59YH0gb25DbGljaz17dGhpcy5zaG93TWVudX0gcmVmPXt0aGlzLmRyb3Bkb3dufT5cclxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWNvbnRyb2xzXCI+XHJcbi8vICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuLy8gICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuLy8gICAgIDwvZGl2PlxyXG4vLyA8L2Rpdj5cclxuLy8ge3RoaXMuc3RhdGUub3BlbiAmJiB0aGlzLm9wdGlvbnN9XHJcbi8vIDwvZGl2PjsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwiLi4vaWNvbnMvc2VhcmNoXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlYXJjaC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImJkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPXt0aGlzLnByb3BzLnBsYWNlaG9sZGVyfSBtYXhMZW5ndGg9XCI1MFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlYXJjaEljb24gLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9O1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKCF0aGlzLnN0YXRlLmNoZWNrZWQpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgZW5hYmxlZENsYXNzID0gdGhpcy5wcm9wcy5kaXNhYmxlZCA/IFwiIGJkLXN3aXRjaC1kaXNhYmxlZFwiIDogXCJcIjtcclxuICAgICAgICBjb25zdCBjaGVja2VkQ2xhc3MgPSB0aGlzLnN0YXRlLmNoZWNrZWQgPyBcIiBiZC1zd2l0Y2gtY2hlY2tlZFwiIDogXCJcIjtcclxuICAgICAgICByZXR1cm4gIDxkaXYgY2xhc3NOYW1lPXtgYmQtc3dpdGNoYCArIGVuYWJsZWRDbGFzcyArIGNoZWNrZWRDbGFzc30+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPXt0aGlzLnByb3BzLmlkfSBjbGFzc05hbWU9e2BiZC1jaGVja2JveGB9IGRpc2FibGVkPXt0aGlzLnByb3BzLmRpc2FibGVkfSBjaGVja2VkPXt0aGlzLnN0YXRlLmNoZWNrZWR9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuaW1wb3J0IFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBmcm9tIFwiLi9jc3NFZGl0b3JEZXRhY2hlZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xyXG4gICAgICAgIHNlbGYuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgc2VsZi5hdHRhY2ggPSBzZWxmLmF0dGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaCA9IHNlbGYuZGV0YWNoLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvbW9ub2thaVwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLmRldGFjaGVkUm9vdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvZGVNaXJyb3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IGF0b2IoX2Njc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2NzcztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBjb25zdCB7ZGV0YWNoZWR9ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICBsZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLCBzdHlsZToge3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0sXHJcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiZWRpdG9yLWRldGFjaGVkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImgzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAhZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBkZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlByZXNzIFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcIixcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soYXJnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChhcmcpIHtcclxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRldGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5kZXRhY2goKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIGJ0b2EodGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGV0YWNoKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGRyb290ID0gc2VsZi5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgaWYgKCFkcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBJTkpFQ1QgUk9PVDogLmFwcFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzZWxmLmRldGFjaGVkRWRpdG9yLCBkcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRldGFjaGVkUm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3REZXRhY2hlZFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdERldGFjaGVkUm9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHAuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLm9uQ2hhbmdlID0gc2VsZi5vbkNoYW5nZS5iaW5kKHNlbGYpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAvLyB0aGlzLnVwZGF0ZUxpbmVDb3VudCgpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL21vbm9rYWlcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5zZXRNb2RlKFwiYWNlL21vZGUvY3NzXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDc3MoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNzc1wiLFxyXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxyXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJTdHlsZTogXCJzaW1wbGVcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNzcygpIHtcclxuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcclxuICAgICAgICBsZXQgY2NzcyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNjc3MgPSBhdG9iKF9jY3NzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHAuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmQtZGV0YWNoZWQtY3NzLWVkaXRvclwiLCBpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWVkaXRvclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtaW5uZXJwYW5lXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHNlbGYub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBhdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2VkaXRvci1kZXRhY2hlZFwiKSkgc2VsZi5wcm9wcy5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgYnRvYSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtoYXNFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJyZWFjdC1lcnJvclwifSwgXCJDb21wb25lbnQgRXJyb3JcIik7ICBcclxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz48cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTIgOS4yOUwxMiAxMy4xN2wzLjg4LTMuODhjLjM5LS4zOSAxLjAyLS4zOSAxLjQxIDAgLjM5LjM5LjM5IDEuMDIgMCAxLjQxbC00LjU5IDQuNTljLS4zOS4zOS0xLjAyLjM5LTEuNDEgMEw2LjcgMTAuN2MtLjM5LS4zOS0uMzktMS4wMiAwLTEuNDEuMzktLjM4IDEuMDMtLjM5IDEuNDIgMHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiI0ZGRkZGRlwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3pcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxyXG4gICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuPC9zdmc+ICovfVxyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxOHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjRkZGRkZGXCIgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxyXG5pbXBvcnQgU2VsZWN0IGZyb20gXCIuL3NlbGVjdFwiO1xyXG5pbXBvcnQgdGltZXN0YW1wUmVuZGVyIGZyb20gXCIuL3RpbWVzdGFtcFJlbmRlclwiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XHJcbiAqL1xyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHJlc2VuY2VTZXR0aW5ncyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxyXG4gICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpZXcgPSBudWxsXHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SW5wdXRUZXh0fSBzZXR0aW5nIFxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRTZXR0aW5nID0gUlBDUHJvcHMuZmluZChlID0+IGUuaWQgPT09IHNldHRpbmcucHJvcHMuaWQpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCB0aGlzLnN0YXRlLmRhdGEsIHtcclxuICAgICAgICAgICAgICAgIFtkZWZhdWx0U2V0dGluZy5pZF06ICEhdmFsdWUgPyB2YWx1ZSA6IG51bGxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5zdGF0ZS5hc3NldHNcclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKClcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxyXG4gICAgfVxyXG5cclxuICAgIGZldGNoQXNzZXRzKCl7XHJcbiAgICAgICAgaWYodGhpcy5pc2ZldGNoaW5nID09PSB0cnVlKXtcclxuICAgICAgICAgICAgbGV0IGFwcCA9IHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCAhPT0gYXBwKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gdHJ1ZVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpXHJcbiAgICAgICAgLnRoZW4oYXNzZXRzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IE9iamVjdC5rZXlzKGFzc2V0cykubWFwKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhc3NldC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXNzZXQudHlwZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUHJldmlldyhkYXRhKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9XHJcbiAgICAgICAgICAgIHN0eWxlPXt7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NHcm91cCB0aXRsZT1cIlJpY2hQcmVzZW5jZSBTZXR0aW5nc1wiIHNldHRpbmdzPXt0aGlzLnByb3BzLnNldHRpbmdzfSBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0vPlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJSaWNoUHJlc2VuY2VcIi8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cclxuICAgICAgICAgICAgICAgICAgICB7UlBDUHJvcHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihlLnR5cGUgPT09IFwidGV4dFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRUZXh0IHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBbPElucHV0TnVtYmVyIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XS8qXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19IC8+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcImNob2ljZVwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dENob2ljZSBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0gY2hvaWNlcz17W3t2YWx1ZTogXCJub25lXCIsIGxhYmVsOiBcIk5vIGFzc2V0c1wifV0uY29uY2F0KHRoaXMuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVua25vd24gY2hvaWNlLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlByZXZpZXdcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgey8qKiBwcmV2aWV3ICovfVxyXG4gICAgICAgICAgICAgICAgICAgIDxScGNQcmV2aWV3IHNldHRpbmdzPXt0aGlzfS8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0ubWFyZ2luQm90dG9tMjB9PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXt3aW5kb3cub2hnb2RvaGZ1Y2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIE9oIGdvZCBPaCBmdWNrXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25jbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxrWWE3cnBzX2c0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VlID8gSSBwdWxsZWQgYSBsaXRsZSBzbmVha3kgb24geWFcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5jb25zdCBSUENQcm9wcyA9IFtcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJBcHBsaWNhdGlvbiBJRFwiLFxyXG4gICAgICAgIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJOYW1lXCIsXHJcbiAgICAgICAgaWQ6IFwibmFtZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkRldGFpbHNcIixcclxuICAgICAgICBpZDogXCJkZXRhaWxzXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU3RhdGVcIixcclxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlRpbWVzdGFtcCBTdGFydFwiLFxyXG4gICAgICAgIGlkOiBcInRpbWVzdGFtcHMuc3RhcnRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMubGFyZ2VcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMuc21hbGxcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG5dXHJcblxyXG5jbGFzcyBJbnB1dFRleHQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG4gICAgICAgIGxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbiAgICAgICAgbGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuICAgICAgICBsZXQgaW5wdXRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdXHJcbiAgICAgICAgbGV0IHNpemVNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2lucHV0TW9kdWxlLmlucHV0V3JhcHBlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPXtgJHtpbnB1dE1vZHVsZS5pbnB1dERlZmF1bHR9ICR7c2l6ZU1vZHVsZTIuc2l6ZTE2fWB9IG5hbWU9XCJzdGF0ZVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJcIiBtYXhsZW5ndGg9XCI5OTlcIiB2YWx1ZT17dGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF19IG9uQ2hhbmdlPXsoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIGV2LnRhcmdldC52YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9fSAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBJbnB1dE51bWJlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgbGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBsZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBpbnB1dE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF1cclxuICAgICAgICBsZXQgc2l6ZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdXHJcbiAgICAgICAgbGV0IGV1aE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtpbnB1dE1vZHVsZS5pbnB1dFdyYXBwZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz17YCR7aW5wdXRNb2R1bGUuaW5wdXREZWZhdWx0fSAke3NpemVNb2R1bGUyLnNpemUxNn1gfSBuYW1lPVwic3RhdGVcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiXCIgbWF4bGVuZ3RoPVwiOTk5XCIgdmFsdWU9e3RoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdfSBvbkNoYW5nZT17KGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IGV2LnRhcmdldC52YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld1ZhbHVlICE9PSBldi50YXJnZXQudmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYudGFyZ2V0LnZhbHVlID0gbmV3VmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgbmV3VmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAge3NldHRpbmcuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiID8gXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUuYnV0dG9uV3JhcHBlcilbMF0uYnV0dG9uV3JhcHBlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9e2Ake2ZsZXhNb2R1bGUuZmxleENoaWxkfSAke2V1aE1vZHVsZTEuYnV0dG9ufSAke2V1aE1vZHVsZTEubG9va0ZpbGxlZH0gJHtldWhNb2R1bGUxLmNvbG9yQnJhbmR9ICR7ZXVoTW9kdWxlMS5zaXplU21hbGx9ICR7ZXVoTW9kdWxlMS5ncm93fWB9IHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcclxuICAgICAgICAgICAgICAgICAgICB9fT5cclxuXHQgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2V1aE1vZHVsZTEuY29udGVudHN9PkNvcHkgY3VycmVudCB0aW1lc3RhbXA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0uZGl2aWRlcn0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF0uZGl2aWRlckRlZmF1bHR9YH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBJbnB1dENob2ljZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBvbkNoYW5nZShkYXRhKXtcclxuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgZGF0YS52YWx1ZSA9PT0gXCJub25lXCIgPyBudWxsIDogZGF0YS52YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxuICAgICAgICBsZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG4gICAgICAgIGxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLmNob2ljZXNcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxTZWxlY3QgdmFsdWU9e1wiYXNzZXQtXCIrdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gfHwgXCJub25lXCJ9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IG9wdGlvbnM9e29wdGlvbnN9Lz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake0JETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXS5kaXZpZGVyfSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXS5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIERpc2NvcmRCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgbGV0IGV1aE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5idXR0b25XcmFwcGVyKVswXS5idXR0b25XcmFwcGVyfT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz17YCR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9ICR7ZXVoTW9kdWxlMS5idXR0b259ICR7ZXVoTW9kdWxlMS5sb29rRmlsbGVkfSAke2V1aE1vZHVsZTEuY29sb3JCcmFuZH0gJHtldWhNb2R1bGUxLnNpemVTbWFsbH0gJHtldWhNb2R1bGUxLmdyb3d9YH0gc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fSBvbkNsaWNrPXt0aGlzLm9uQ2xpY2t9PlxyXG5cdCAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17ZXVoTW9kdWxlMS5jb250ZW50c30+e3RoaXMucHJvcHMudGl0bGV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBScGNQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzID0ge30pe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogXCJwcm9maWxlXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50YWJzID0gW11cclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcy5zZXR0aW5ncy5wcmV2aWV3ID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVRhYih0YWIpe1xyXG4gICAgICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmVcclxuICAgICAgICBpZihhbmNpZW50VGFiID09PSB0YWIucHJvcHMuaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgICBlLnNldEFjdGl2ZShmYWxzZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSlcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiB0YWIucHJvcHMuaWRcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBwcmV2aWV3ID0gbmV3IHRoaXMucHJldmlldyh7XHJcbiAgICAgICAgICAgIHByZXZpZXc6IHRoaXNcclxuICAgICAgICB9KVxyXG4gICAgICAgIHByZXZpZXcuc2V0U3RhdGUodGhpcy5zdGF0ZS5ycGMpXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYldyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJuYXZcIiBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIkZ1bGwgUHJvZmlsZVwiIGlkPVwicHJvZmlsZVwiLz5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJVc2VyIFBvcG91dFwiIGlkPVwicG9wb3V0XCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAge3ByZXZpZXcucmVuZGVyKCl9XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfSAgIFxyXG5cclxuICAgIGlzQWN0aXZlKHRhYil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlID09PSB0YWJcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJldmlldygpe1xyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlID09PSBcInByb2ZpbGVcIilyZXR1cm4gUHJvZmlsZVxyXG4gICAgICAgIHJldHVybiBQb3BvdXRcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGFiIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9wcy5wcmV2aWV3LnRhYnMucHVzaCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZShpc0FjdGl2ZSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogISFpc0FjdGl2ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGBsYy1uYXZJdGVtYFxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlKXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUFjdGl2ZWBcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUluYWN0aXZlYFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMucHJldmlldy5jaGFuZ2VUYWIodGhpcylcclxuICAgICAgICB9fT5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBQb3BvdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHVzZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgbGV0IGF2YXRhclVSTCA9IHVzZXIuZ2V0QXZhdGFyVVJMKHVzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSA/IFwiZ2lmXCIgOiBcInBuZ1wiKVxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIG5hbWVUYWdNb2R1bGUxLFxyXG4gICAgICAgICAgICBhY3Rpdml0eU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHRleHRNb2R1bGUxLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMSxcclxuICAgICAgICAgICAgc2Nyb2xsZXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBub3RlTW9kdWxlMSxcclxuICAgICAgICAgICAgcHJvdGlwTW9kdWxlMSxcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUxLFxyXG4gICAgICAgICAgICBNZXNzYWdlcyxcclxuICAgICAgICAgICAgYXZhdGFyTW9kdWxlMVxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJQb3BvdXQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ib3QpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hY3Rpdml0eVVzZXJQb3BvdXQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tdXRlZCAmJiBlLndyYXBwZXIgJiYgZS5iYXNlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudGhlbWVHaG9zdEhhaXJsaW5lQ2hhbm5lbHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub3RlICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBybyAmJiBlLmlubGluZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcylbMF0uZGVmYXVsdC5NZXNzYWdlcyxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXBcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdXNlclBvcG91dFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VyUG9wb3V0fSByb2xlPVwiZGlhbG9nXCIgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyUGxheWluZ30+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS52ZXJ0aWNhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5Q2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLmFsaWduQ2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5oZWFkZXJUb3B9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYXZhdGFyV3JhcHBlck5vcm1hbH0gcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YXZhdGFyTW9kdWxlMX0gcm9sZT1cImltZ1wiIHN0eWxlPXt7d2lkdGg6IFwiODBweFwiLCBoZWlnaHQ6IFwiODBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjkyXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDkyIDgwXCIgY2xhc3M9e2Ake2F2YXRhck1vZHVsZTEubWFza30gJHthdmF0YXJNb2R1bGUxLnN2Z31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17YXZhdGFyVVJMfSBhbHQ9XCIgXCIgY2xhc3M9e2F2YXRhck1vZHVsZTEuYXZhdGFyfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdGF0dXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBjbGFzcz17cm9vdE1vZHVsZTEuYXZhdGFySGludH0gdmlld0JveD1cIjAgMCA4MCA4MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJIaW50SW5uZXJ9PntNZXNzYWdlcy5WSUVXX1BST0ZJTEV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJUZXh0fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEuaGVhZGVyVGFnTm9OaWNrbmFtZX0gJHtuYW1lVGFnTW9kdWxlMS5uYW1lVGFnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YCR7bmFtZVRhZ01vZHVsZTEudXNlcm5hbWV9ICR7cm9vdE1vZHVsZTEuaGVhZGVyVGFnVXNlcm5hbWVOb05pY2tuYW1lfWB9Pnt1c2VyLnVzZXJuYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+I3t1c2VyLmRpc2NyaW1pbmF0b3J9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eVVzZXJQb3BvdXR9ICR7cm9vdE1vZHVsZTEuYWN0aXZpdHl9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmhlYWRlclRleHROb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0+e01lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkd9PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFbXCJhc3NldHMubGFyZ2VcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgfSBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlSW1hZ2VVc2VyUG9wb3V0fSAke2RhdGFbXCJhc3NldHMuc21hbGxcIl0gPyBhY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VNYXNrVXNlclBvcG91dCA6IFwiXCJ9YH0gLz4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2B9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzU21hbGxJbWFnZVVzZXJQb3BvdXR9IC8+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0fSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5uYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5uYW1lTm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fWB9IHRpdGxlPXtkYXRhLm5hbWV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eU5hbWV9PntkYXRhLm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLmRldGFpbHMpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgdGl0bGU9e2RhdGEudGl0bGV9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuZGV0YWlsc30+e2RhdGEuZGV0YWlsc308L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5zdGF0ZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnN0YXRlfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPXtkYXRhLnN0YXRlfT57ZGF0YS5zdGF0ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZUNvbXBvbmVudCA9IHRpbWVzdGFtcFJlbmRlcihUaW1lc3RhbXAsIE1lc3NhZ2VzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Jvb3RNb2R1bGUxLmJvZHl9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJ9ICR7cm9vdE1vZHVsZTEuYm9keUlubmVyfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5ib2R5VGl0bGV9PntNZXNzYWdlcy5OT1RFfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtub3RlTW9kdWxlMS5ub3RlfSAke3Jvb3RNb2R1bGUxLm5vdGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9e01lc3NhZ2VzLk5PVEVfUExBQ0VIT0xERVJ9IG1heGxlbmd0aD1cIjI1NlwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgY2xhc3M9e0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IHN0eWxlPXt7aGVpZ2h0OiBcIjM2cHhcIn19IGRpc2FibGVkPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5mb290ZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLnByb3RpcH0gJHtwcm90aXBNb2R1bGUxLmlubGluZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHtwcm90aXBNb2R1bGUxLnByb30gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfSBzdHlsZT17e2NvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCJ9fT57TWVzc2FnZXMuUElOTkVEX01FU1NBR0VTX1BST19USVB9PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7Y29sb3JNb2R1bGUxLmNvbG9yU3RhbmRhcmR9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fSAke3Byb3RpcE1vZHVsZTEudGlwfWB9PntNZXNzYWdlcy5DT05URVhUX01FTlVfSElOVH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFN0YXR1cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc3RhdHVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UHJlc2VuY2UpWzBdLmRlZmF1bHQuZ2V0UHJlc2VuY2UoKS5zdGF0dXNcclxuICAgICAgICBpZihzdGF0dXMgPT09IFwiaW52aXNpYmxlXCIpc3RhdHVzID0gXCJvZmZsaW5lXCJcclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgIHJldHVybiA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB4PVwiNjBcIiB5PVwiNjBcIiBmaWxsPVwiI2ZmZmZmZlwiIG1hc2s9e2B1cmwoI3N2Zy1tYXNrLXN0YXR1cy0ke3N0YXR1c30pYH0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PjwvcmVjdD5cclxuICAgIH1cclxufVxyXG5cclxubGV0IHRpbWVzdGFtcENsYXNzID0gXCJcIlxyXG5cclxuY2xhc3MgUHJvZmlsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgYXZhdGFyTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBNZXNzYWdlc1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXggJiYgZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmJvdClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFjdGl2aXR5UHJvZmlsZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm11dGVkICYmIGUud3JhcHBlciAmJiBlLmJhc2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlckZhZGUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub3RlICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzKVswXS5kZWZhdWx0Lk1lc3NhZ2VzXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgdGltZXN0YW1wQ2xhc3MgPSB0aW1lc3RhbXBDbGFzcyB8fCBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXHJcblxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnblN0cmV0Y2h9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLnJvb3R9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS50b3BTZWN0aW9uUGxheWluZ30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5hdmF0YXJ9ICR7YXZhdGFyTW9kdWxlMS53cmFwcGVyfWB9IHJvbGU9XCJpbWdcIiBzdHlsZT17e3dpZHRoOiBcIjgwcHhcIiwgaGVpZ2h0OiBcIjgwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI5MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA5MiA4MFwiIGNsYXNzPXtgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9e2F2YXRhclVSTH0gYWx0PVwiIFwiIGNsYXNzPXthdmF0YXJNb2R1bGUxLmF2YXRhcn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdHVzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmhlYWRlckluZm99YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEubmFtZVRhZ30gJHtuYW1lVGFnTW9kdWxlMS5uYW1lVGFnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YCR7cm9vdE1vZHVsZTEudXNlcm5hbWV9ICR7cm9vdE1vZHVsZTEudXNlcm5hbWV9YH0+e3VzZXIudXNlcm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17cm9vdE1vZHVsZTEuZGlzY3JpbWluYXRvcn0+I3t1c2VyLmRpc2NyaW1pbmF0b3J9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VzfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyRmlsbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlQcm9maWxlfSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmhlYWRlclRleHROb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5sYXJnZVwiXX0ucG5nYH0gY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlUHJvZmlsZX0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1Byb2ZpbGUgOiBcIlwifWB9IC8+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdfS5wbmdgfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlfSAvPilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5jb250ZW50SW1hZ2VzUHJvZmlsZX0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLm5hbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gfSB0aXRsZT17ZGF0YS5uYW1lfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eU5hbWV9PntkYXRhLm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuZGV0YWlscylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHRpdGxlPXtkYXRhLnRpdGxlfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmRldGFpbHN9PntkYXRhLmRldGFpbHN9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuc3RhdGUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnN0YXRlfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9e2RhdGEuc3RhdGV9PntkYXRhLnN0YXRlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZUNvbXBvbmVudCA9IHRpbWVzdGFtcFJlbmRlcihUaW1lc3RhbXAsIE1lc3NhZ2VzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYm9keX0+XHJcblx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlfWB9PlxyXG5cdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyfT5cclxuXHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9ufT5cclxuXHRcdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb25IZWFkZXJ9PntNZXNzYWdlcy5OT1RFfTwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLm5vdGV9ICR7bm90ZU1vZHVsZTEubm90ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj17TWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUn0gbWF4bGVuZ3RoPVwiMjU2XCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBzdHlsZT17e2hlaWdodDogXCI0MHB4XCJ9fSBkaXNhYmxlZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdCAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29ubmVjdGVkQWNjb3VudHMgLz5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGMtIFwiPjwvZGl2PlxyXG4gICAgICAgIF1cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGFjY291bnRzID0gW11cclxuICAgICAgICBsZXQgcm9vdE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG4gICAgICAgIGxldCBBY2NvdW50TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEFjY291bnRzKVswXS5kZWZhdWx0XHJcblxyXG4gICAgICAgIGxldCBhY2NzID0gQWNjb3VudE1vZHVsZTEuZ2V0QWNjb3VudHMoKS5maWx0ZXIoZSA9PiBlLnZpc2liaWxpdHkgPT09IDEpXHJcbiAgICAgICAgZm9yKGxldCBhY2Mgb2YgYWNjcyl7XHJcbiAgICAgICAgICAgIGFjY291bnRzLnB1c2goPENvbm5lY3RlZEFjY291bnQgYWNjPXthY2N9IC8+KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYWNjb3VudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9ufT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRzfT5cclxuICAgICAgICAgICAgICAgICAgICB7YWNjb3VudHN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb25uZWN0ZWRBY2NvdW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsb3dlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIGFuY2hvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIFNvY2lhbENvbnN0YW50c1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXggJiYgZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFuY2hvcilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldCAmJiBlLmRlZmF1bHQubWFwKVswXS5kZWZhdWx0XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBhY2MgPSB0aGlzLnByb3BzLmFjY1xyXG4gICAgICAgIGxldCBjb25zdGFudHNTb2NpYWwgPSBTb2NpYWxDb25zdGFudHMuZ2V0KGFjYy50eXBlKVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtmbGV4TW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudH1gfSBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICA8aW1nIGFsdD17YExvZ28gJHtjb25zdGFudHNTb2NpYWwubmFtZX1gfSBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudEljb259IHNyYz17Y29uc3RhbnRzU29jaWFsLmljb24uY29sb3IgfHwgY29uc3RhbnRzU29jaWFsLmljb24ud2hpdGUgfHwgY29uc3RhbnRzU29jaWFsLmljb24uZ3JleX0gLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lcn0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50TmFtZX0+e2FjYy5uYW1lfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAge2FjYy52ZXJpZmllZCA/ICg8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJDb250YWluZXJ9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbn1gfSBzdHlsZT17e3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPXtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJ9IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTUuMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiM0ZjU0NWNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtmbG93ZXJNb2R1bGUxLmNoaWxkQ29udGFpbmVyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNS4yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCIgZmlsbD1cIiNmZmZmZmZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+KSA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YSBjbGFzcz17YCR7YW5jaG9yTW9kdWxlMS5hbmNob3J9ICR7YW5jaG9yTW9kdWxlMS5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWB9IHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50T3Blbkljb259IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xMCA1VjNINS4zNzVDNC4wNjUxOSAzIDMgNC4wNjUxOSAzIDUuMzc1VjE4LjYyNUMzIDE5LjkzNiA0LjA2NTE5IDIxIDUuMzc1IDIxSDE4LjYyNUMxOS45MzYgMjEgMjEgMTkuOTM2IDIxIDE4LjYyNVYxNEgxOVYxOUg1VjVIMTBaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTIxIDIuOTk5MDJIMTRWNC45OTkwMkgxNy41ODZMOS4yOTI5NyAxMy4yOTJMMTAuNzA3IDE0LjcwNkwxOSA2LjQxMzAyVjkuOTk5MDJIMjFWMi45OTkwMlpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQmFkZ2VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCByb290TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuICAgICAgICBsZXQgVXNlckZsYWdzID0gQkRNb2R1bGVzLmdldChlID0+IGUuVXNlckZsYWdzKVswXS5Vc2VyRmxhZ3NcclxuICAgICAgICBsZXQgYmFkZ2VzID0gW11cclxuICAgICAgICBsZXQgc2VyaWFsaXplZCA9IFtdXHJcblxyXG4gICAgICAgIGZvcihsZXQgZmxhZ05hbWUgaW4gVXNlckZsYWdzKXtcclxuICAgICAgICAgICAgaWYodXNlci5oYXNGbGFnKFVzZXJGbGFnc1tmbGFnTmFtZV0pKXNlcmlhbGl6ZWQucHVzaChmbGFnTmFtZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcihsZXQgZmxhZ05hbWUgb2Ygc2VyaWFsaXplZCl7XHJcbiAgICAgICAgICAgIGxldCBzZWFyY2hhYmxlID0gYHByb2ZpbGVCYWRnZSR7ZmxhZ05hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiIFwiKS5zcGxpdChcIiBcIikubWFwKGUgPT4gZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkpLmpvaW4oXCJcIil9YFxyXG4gICAgICAgICAgICBzZWFyY2hhYmxlID0gc2VhcmNoYWJsZS5yZXBsYWNlKFwiSHlwZXNxdWFkT25saW5lXCIsIFwiSHlwZVNxdWFkT25saW5lXCIpXHJcbiAgICAgICAgICAgIGlmKCFyb290TW9kdWxlW3NlYXJjaGFibGVdKWNvbnRpbnVlXHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKDxCYWRnZSBuYW1lPXtzZWFyY2hhYmxlfS8+KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXtcclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goPEJhZGdlIG5hbWU9XCJwcm9maWxlQmFkZ2VQcmVtaXVtXCIgLz4pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBiYWRnZXNcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VXcmFwcGVyfT5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlfSAke3Jvb3RNb2R1bGUxW3RoaXMucHJvcHMubmFtZV19YH0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGltZXN0YW1wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGltZXN0YW1wQ2xhc3N9PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0xheWVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5rZXl1cExpc3RlbmVyID0gdGhpcy5rZXl1cExpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAga2V5dXBMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLnJlZnMucm9vdC5wYXJlbnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqIHByb2dyZXNzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMua2V5dXBMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoaXNOb2RlID0gRE9NLnF1ZXJ5KGAjJHt0aGlzLnByb3BzLmlkfWApO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MS4xIC0gMC4xICogKDEgLSBwcm9ncmVzcyl9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBET00ucXVlcnkoXCIucHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LnJlbW92ZShcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqIHByb2dyZXNzICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiW2NsYXNzKj1cXFwibGF5ZXItXFxcIl1cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LmFkZChcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqICgxIC0gcHJvZ3Jlc3MpICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gMSAtIHByb2dyZXNzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwibGF5ZXIgYmQtbGF5ZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLCBpZDogdGhpcy5wcm9wcy5pZCwgcmVmOiBcInJvb3RcIiwgc3R5bGU6IHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IFwic2NhbGUoMS4xKSB0cmFuc2xhdGVaKDBweClcIn19LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4uL3Rvb2xzXCI7XHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuLi90YWJCYXJIZWFkZXJcIjtcclxuaW1wb3J0IFRhYkJhckl0ZW0gZnJvbSBcIi4uL3RhYkJhckl0ZW1cIjtcclxuXHJcbmltcG9ydCBTZXJ2ZXJDYXJkIGZyb20gXCIuL3NlcnZlckNhcmRcIjtcclxuaW1wb3J0IFNpZGViYXJWaWV3IGZyb20gXCIuL3NpZGViYXJWaWV3XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHVibGljU2VydmVycyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5ID0gdGhpcy5jaGFuZ2VDYXRlZ29yeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaEtleURvd24gPSB0aGlzLnNlYXJjaEtleURvd24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbiA9IHRoaXMuY2hlY2tDb25uZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xyXG4gICAgICAgIHRoaXMuQXZhdGFyRGVmYXVsdHMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0VXNlckF2YXRhclVSTFwiLCBcIkRFRkFVTFRfQVZBVEFSU1wiXSk7XHJcbiAgICAgICAgdGhpcy5JbnZpdGVBY3Rpb25zID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7XHJcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlcnZlcnM6IFtdLFxyXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogMCxcclxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJvcHMucm9vdElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGZldGNoKGAke3NlbGYuZW5kUG9pbnR9JHtxdWVyeX0ke3F1ZXJ5ID8gXCImc2NoZW1hPW5ld1wiIDogXCI/c2NoZW1hPW5ld1wifWAsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgYXdhaXQgcmVzLnRleHQoKVxyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gZGF0YS5yZXN1bHRzLnJlZHVjZSgoYXJyLCBzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNlcnZlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBhcnIucHVzaCg8U2VydmVyQ2FyZCBzZXJ2ZXI9e3NlcnZlcn0gam9pbj17c2VsZi5qb2lufS8+KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZlcnMgPSBzZWxmLnN0YXRlLnNlcnZlcnMuY29uY2F0KHNlcnZlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zZXJ2ZXJzLnVuc2hpZnQoc2VsZi5iZFNlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlbmQgPSBkYXRhLnNpemUgKyBkYXRhLmZyb207XHJcbiAgICAgICAgICAgIGRhdGEubmV4dCA9IGA/ZnJvbT0ke2VuZH1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkpIGRhdGEubmV4dCArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoZW5kID49IGRhdGEudG90YWwpIHtcclxuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XHJcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBgU2hvd2luZyAxLSR7ZW5kfSBvZiAke2RhdGEudG90YWx9IHJlc3VsdHMgaW4gJHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIHRpdGxlICs9IGAgZm9yICR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcblxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VydmVyczogc2VydmVycyxcclxuICAgICAgICAgICAgICAgIG5leHQ6IGRhdGEubmV4dFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVmcy5zYnYucmVmcy5jb250ZW50U2Nyb2xsZXIuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgam9pbihzZXJ2ZXJDYXJkKSB7XHJcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcclxuXHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5qb2luRW5kUG9pbnR9LyR7c2VydmVyQ2FyZC5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcn1gLHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZi53aW5kb3dPcHRpb25zO1xyXG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XHJcbiAgICAgICAgb3B0aW9ucy55ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWSArIHdpbmRvdy5pbm5lckhlaWdodCAvIDIgLSBvcHRpb25zLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0P3Njb3Blcz1ndWlsZHMuam9pbiZwcmV2aW91c1VybD1odHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIjtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cud2ViQ29udGVudHMub24oXCJkaWQtbmF2aWdhdGVcIiwgKGV2ZW50LCB1cmwpID0+IHtcclxuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XHJcbiAgICAgICAgICAgIHNlbGYuam9pbldpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy5sb2FkVVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IDUwMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjgyYjMwXCIsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWluaW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICB3ZWJQcmVmZXJlbmNlczoge1xyXG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYmRTZXJ2ZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkJldHRlckRpc2NvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjc1MDArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiMjAwMDArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9pY29ucy84NjAwNDc0NDk2NjkxNDA0OC8yOTJlN2Y2YmZmZjJiNzFkZmQxM2U1MDhhODU5YWVkZC53ZWJwXCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjBUbWZvNVpiT1JDUnFiQWRcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXIyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiNTArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgTGlnaHRjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzcwNTkwODM1MDIxODY2NjExNy8wNWE1NjUyZjdkMWQwYWUzMjhjYTdkNmUyMzU0YTgyYS53ZWJwXCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjdlRmZmMkFcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlciwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vc2VhcmNoLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBqb2luRW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0RW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogMCxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBkYXRhXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZWJhclZpZXcsIHtyZWY6IFwic2J2XCJ9LCB0aGlzLmNvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaWRlYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuc2lkZWJhclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29udGVudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b29sczoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwicHRcIiwgcmVmOiBcInRvb2xzXCIsIG9uQ2xpY2s6IHRoaXMuY2xvc2V9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lkZWJhcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJcIiwga2V5OiBcInBzXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyIFNJREVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCIsIHN0eWxlOiB7Zm9udFNpemU6IFwiMTZweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJQdWJsaWMgU2VydmVyc1wiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySGVhZGVyLCB7dGV4dDogXCJDYXRlZ29yaWVzXCJ9KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7aWQ6IGluZGV4LCBvbkNsaWNrOiB0aGlzLmNoYW5nZUNhdGVnb3J5LCBrZXk6IGluZGV4LCB0ZXh0OiB2YWx1ZSwgc2VsZWN0ZWQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gaW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VhcmNoSW5wdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRleHQtaW5wdXQgZmxleC12ZXJ0aWNhbFwiLCBzdHlsZToge3dpZHRoOiBcIjE3MnB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7cmVmOiBcInNlYXJjaGlucHV0XCIsIG9uS2V5RG93bjogdGhpcy5zZWFyY2hLZXlEb3duLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwidGV4dFwiLCBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBwbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIiwgbWF4TGVuZ3RoOiBcIjUwXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nIHx8IGUud2hpY2ggIT09IDEzKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgcXVlcnkgPSBgP3Rlcm09JHtlLnRhcmdldC52YWx1ZX1gO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcclxuICAgICAgICAgICAgcXVlcnkgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYXRlZ29yeUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBzZWxmLnJlZnMuc2VhcmNoaW5wdXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5jb25uZWN0aW9uLnN0YXRlID09PSAxKSByZXR1cm4gc2VsZi5ub3RDb25uZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7cmVmOiBcImNvbnRlbnRcIiwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSksXHJcbiAgICAgICAgICAgIHNlbGYuYmRTZXJ2ZXIsXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7a2V5OiBzZXJ2ZXIuaWRlbnRpZmllciwgc2VydmVyOiBzZXJ2ZXIsIGpvaW46IHNlbGYuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLCBzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWFyZ2luVG9wOiBcIjEwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5sb2FkaW5nID8gXCJMb2FkaW5nXCIgOiBcIkxvYWQgTW9yZVwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5sZW5ndGggPiAwICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdENvbm5lY3RlZCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvL3JldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwgeyB0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlIH0pO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJuY2NcIiwgcmVmOiBcImNvbnRlbnRcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgICAgICBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IFwiMThweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjE0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSwgc2VsZi5iZFNlcnZlclxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJhXCIsXHJcbiAgICAgICAgICAgICAgICB7aHJlZjogXCJodHRwczovL2Rpc2NvcmRzZXJ2ZXJzLmNvbVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJEaXNjb3Jkc2VydmVycy5jb21cIlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCB7Y29ubmVjdGlvbn0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSAyKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge2NvbG9yOiBcIiNiOWJiYmVcIiwgZm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgXCJDb25uZWN0ZWQgYXM6IFwiLFxyXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge3BhZGRpbmc6IFwiNXB4IDEwcHggMCAxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWluSGVpZ2h0OiBcIjIwcHhcIn0sIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wiLCBvbkNsaWNrOiBzZWxmLmNvbm5lY3R9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlJlY29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxufVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXJ2ZXJDYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuc2VydmVyLmljb25VcmwpIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2luZWQ6IHRoaXMucHJvcHMuZ3VpbGRMaXN0LmluY2x1ZGVzKHRoaXMucHJvcHMuc2VydmVyLmlkZW50aWZpZXIpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjYXJkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2FyZCAmJiBlLmNhcmRQcmltYXJ5KVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxyXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxyXG4gICAgICAgICAgICAvLyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge3JlZjogXCJpbWdcIiwgY2xhc3NOYW1lOiBcImJkLXNlcnZlci1pbWFnZVwiLCBzcmM6IHNlcnZlci5pY29uVXJsLCBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyl9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuZmxleENoaWxkK1wiIGJkLXNlcnZlci1jb250ZW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwK1wiIGJkLXNlcnZlci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1uYW1lXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5tZW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5IGJkLXNlcnZlci1kZXNjcmlwdGlvbi1jb250YWluZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBzY3JvbGxlciBiZC1zZXJ2ZXItZGVzY3JpcHRpb25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGNvbG9yR3JlZW4tMjlpQUtZXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiIzNhYzE1Y1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGRpc2FibGVkLTlhRjJ1Z1wiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiNjMTNhM2FcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk5cIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCJ9LCBvbkNsaWNrOiAoKSA9PiB7dGhpcy5qb2luKCk7fX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAvLyApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZUVycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XHJcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4uL3Njcm9sbGVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZWJhclZpZXcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NpZGViYXIsIGNvbnRlbnQsIHRvb2xzfSA9IHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aSB1aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJSZWdpb24tVkZUVWtOIHNpZGViYXItcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7a2V5OiBcInNpZGViYXJTY3JvbGxlclwiLCByZWY6IFwic2lkZWJhclNjcm9sbGVyXCIsIHNpZGViYXI6IHRydWUsIGZhZGU6IHNpZGViYXIuZmFkZSB8fCB0cnVlLCBkYXJrOiBzaWRlYmFyLmRhcmsgfHwgdHJ1ZX0sIHNpZGViYXIuY29tcG9uZW50KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50UmVnaW9uLTNuRHVZeSBjb250ZW50LXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRUcmFuc2l0aW9uV3JhcC0zaHFPRVcgY29udGVudC10cmFuc2l0aW9uLXdyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcC0zWVpYZG0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdC0yOE1TbjAgc2Nyb2xsZXJUcmFjay0xWklwc3ZcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyLTI2bmMxZSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlciBzY3JvbGxlclwiLCByZWY6IFwiY29udGVudFNjcm9sbGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudENvbHVtbi0yaHJJWUggY29udGVudENvbHVtbkRlZmF1bHQtMVZRa0dNIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sIGNvbnRlbnQuY29tcG9uZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzLmNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xyXG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25DbGljayxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1elwifSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2Nyb2xsZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9zY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXlcclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJIb3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyUmVnaW9uU2Nyb2xsZXIpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9JHt0aGlzLnByb3BzLmZhZGUgPyBcIiBcIitzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlIDogXCJcIn1gO1xyXG4gICAgICAgIGxldCBzY3JvbGxlckNsYXNzID0gc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyK1wiIHNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpZGViYXIpIHNjcm9sbGVyQ2xhc3MgKz0gYCAke3Njcm9sbGVyTW9kdWxlMi5zaWRlYmFyUmVnaW9uU2Nyb2xsZXJ9IHNpZGViYXItcmVnaW9uLXNjcm9sbGVyYFxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgc2Nyb2xsZXJDbGFzcyArPSBcIiBcIitzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyK1wiIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXB9IGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRyYWNrfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJ3cmFwXCIsIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJcIiwgcmVmOiBcInNjcm9sbGVyXCIsIGNsYXNzTmFtZTogc2Nyb2xsZXJDbGFzc30sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwge2NsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKHNlY3Rpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCJcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0XCIpfVxyXG4gKi9cclxuY29uc3QgUmVhY3QgPSBCRFYyLnJlYWN0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlY3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgaGFuZGxlQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vbkNoYW5nZSA9PSBcImZ1bmN0aW9uXCIpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBmbGV4ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuV3JhcCAmJiBlLmRlZmF1bHQuRGlyZWN0aW9uICYmIGUuZGVmYXVsdC5DaGlsZClbMF0uZGVmYXVsdFxyXG4gICAgICAgIGxldCBuYXRpdmVTZWxlY3QgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJTZWxlY3RUZW1wV3JhcHBlclwiKVswXS5kZWZhdWx0XHJcbiAgICAgICAgcmV0dXJuICg8ZmxleCBkaXJlY3Rpb249e2ZsZXguRGlyZWN0aW9uLkhPUklaT05UQUx9IGFsaWduPXtmbGV4LkFsaWduLkNFTlRFUn0+XHJcbiAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChuYXRpdmVTZWxlY3QsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICAgICAgfSkpfVxyXG4gICAgICAgICAgICA8L2ZsZXg+KS8qXHJcbiAgICAgICAgcmV0dXJuIEJERkRCLlJlYWN0VXRpbHMuY3JlYXRlRWxlbWVudChJbnRlcm5hbENvbXBvbmVudHMuTGlicmFyeUNvbXBvbmVudHMuRmxleCwge1xyXG4gICAgICAgICAgICBjbGFzc05hbWU6IEJERkRCLmRpc0NOLnNlbGVjdHdyYXBwZXIsXHJcbiAgICAgICAgICAgIGRpcmVjdGlvbjogSW50ZXJuYWxDb21wb25lbnRzLkxpYnJhcnlDb21wb25lbnRzLkZsZXguRGlyZWN0aW9uLkhPUklaT05UQUwsXHJcbiAgICAgICAgICAgIGFsaWduOiBJbnRlcm5hbENvbXBvbmVudHMuTGlicmFyeUNvbXBvbmVudHMuRmxleC5BbGlnbi5DRU5URVIsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBCREZEQi5SZWFjdFV0aWxzLmNyZWF0ZUVsZW1lbnQoSW50ZXJuYWxDb21wb25lbnRzLk5hdGl2ZVN1YkNvbXBvbmVudHMuU2VsZWN0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICB9KTsqL1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL3N3aXRjaFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzR3JvdXAgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3RpdGxlLCBzZXR0aW5ncywgYnV0dG9ufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiB0aXRsZX0pLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICAgICAgfSldO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vc3dpdGNoXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7c2V0dGluZ3N9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGhpcy5wcm9wcy50aXRsZX0pLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmJ1dHRvbiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge2tleTogXCJ0aXRsZS1idXR0b25cIiwgY2xhc3NOYW1lOiBcImJkLXBmYnRuXCIsIG9uQ2xpY2s6IHRoaXMucHJvcHMuYnV0dG9uLm9uQ2xpY2t9LCB0aGlzLnByb3BzLmJ1dHRvbi50aXRsZSksXHJcbiAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzVGl0bGUgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4vL2gyLTJnV0UtbyB0aXRsZS0zc1pXWVEgc2l6ZTE2LTE0Y0d6NSBoZWlnaHQyMC1tTzJlSU4gd2VpZ2h0U2VtaUJvbGQtTkpleHppIGRhLWgyIGRhLXRpdGxlIGRhLXNpemUxNiBkYS1oZWlnaHQyMCBkYS13ZWlnaHRTZW1pQm9sZCBkZWZhdWx0Q29sb3ItMV9halgwIGRhLWRlZmF1bHRDb2xvciBtYXJnaW5Ub3A2MC0zUEdidEsgZGEtbWFyZ2luVG9wNjAgbWFyZ2luQm90dG9tMjAtMzJxSUQ3IGRhLW1hcmdpbkJvdHRvbTIwXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjAgXCIrQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdLm1hcmdpblRvcDYwfSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuL3RhYkJhckhlYWRlclwiO1xyXG5pbXBvcnQgVGFiQmFySXRlbSBmcm9tIFwiLi90YWJCYXJJdGVtXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZUJhciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNpID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltjbGFzcyo9c2lkZS1dID4gW2NsYXNzKj1zZWxlY3RlZF1cIik7XHJcbiAgICAgICAgaWYgKHNpKSB0aGlzLnNjbiA9IHNpLmNsYXNzTmFtZTtcclxuICAgICAgICBjb25zdCBucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbY2xhc3MqPXNpZGUtXSA+IFtjbGFzcyo9J2l0ZW0tJ106bm90KFtjbGFzcyo9c2VsZWN0ZWRdKVwiKTtcclxuICAgICAgICBpZiAobnMpIHRoaXMubnNjbiA9IG5zLmNsYXNzTmFtZTtcclxuICAgICAgICBjb25zdCB0YWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltjbGFzcyo9J3NpZGUtJ10gPiBbY2xhc3MqPSdpdGVtLSddXCIpO1xyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0YWJzKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZCA9IHRoaXMuc2V0U2VsZWN0ZWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IG51bGwsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBzZWxmLnByb3BzLml0ZW1zXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvbiA9IHNlbGYucHJvcHMuaXRlbXMuZmluZChpdGVtID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluaXRpYWxTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZWxlY3RlZCA9IGluaXRpYWxTZWxlY3Rpb24uaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCB7aGVhZGVyVGV4dH0gPSBzZWxmLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IHtpdGVtcywgc2VsZWN0ZWR9ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckhlYWRlciwge3RleHQ6IGhlYWRlclRleHQsIGJ1dHRvbjogdGhpcy5wcm9wcy5oZWFkZXJCdXR0b259KSxcclxuICAgICAgICAgICAgaXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qge2lkLCB0ZXh0fSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckl0ZW0sIHtrZXk6IGlkLCBzZWxlY3RlZDogc2VsZWN0ZWQgPT09IGlkLCB0ZXh0OiB0ZXh0LCBpZDogaWQsIG9uQ2xpY2s6IHNlbGYub25DbGlja30pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWQoZSkge1xyXG4gICAgICAgIGUudGFyZ2V0LmNsYXNzTmFtZSA9IHRoaXMuc2NuO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soaWQpIHtcclxuICAgICAgICBjb25zdCBzaSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbY2xhc3MqPXNpZGVdID4gW2NsYXNzKj1zZWxlY3RlZF1cIik7XHJcbiAgICAgICAgaWYgKHNpKSB7XHJcbiAgICAgICAgICAgIHNpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnNldFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgc2kuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuc2V0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICBzaS5jbGFzc05hbWUgPSB0aGlzLm5zY247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZWxlY3RlZDogbnVsbH0pO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkOiBpZH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB0aGlzLnByb3BzLm9uQ2xpY2soaWQpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoSXRlbSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5jaGVja2VkID0gIXRoaXMucHJvcHMuY2hlY2tlZDtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsIHRoaXMucHJvcHMuY2hlY2tlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0ZXh0LCBpbmZvfSA9IHRoaXMucHJvcHMuZGF0YTtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LXZlcnRpY2FsIGZsZXgtanVzdGlmeS1zdGFydCBmbGV4LWFsaWduLXN0cmV0Y2ggZmxleC1ub3dyYXAgdWktc3dpdGNoLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC1ob3Jpem9udGFsIGZsZXgtanVzdGlmeS1zdGFydCBmbGV4LWFsaWduLXN0cmV0Y2ggZmxleC1ub3dyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDMgbWFyZ2luLXJlc2V0IG1hcmdpbi1yZXNldCB1aS1mbGV4LWNoaWxkXCJ9LCB0ZXh0KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkfSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10ZXh0IHN0eWxlLWRlc2NyaXB0aW9uIG1hcmdpbi10b3AtNFwiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LCBpbmZvKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckhlYWRlciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJ9LCB0aGlzLnByb3BzLnRleHQsIHRoaXMucHJvcHMuYnV0dG9uKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFySXRlbSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLnByb3BzLnNlbGVjdGVkIHx8IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogYHVpLXRhYi1iYXItaXRlbSR7dGhpcy5wcm9wcy5zZWxlY3RlZCA/IFwiIHNlbGVjdGVkXCIgOiBcIlwifWAsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljayh0aGlzLnByb3BzLmlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhclNlcGFyYXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLXNlcGFyYXRvciBtYXJnaW4tdG9wLTggbWFyZ2luLWJvdHRvbS04XCJ9KTtcclxuICAgIH1cclxufSIsIlwidXNlIHN0cmljdFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5yZWFjdFxyXG5cclxuY29uc3QgaW50ZXJ2YWxNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuSW50ZXJ2YWwpWzBdXHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcG9uZW50LCBNZXNzYWdlcykge1xyXG4gICAgY2xhc3MgVGltZVJlbmRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsID0gbmV3IGludGVydmFsTW9kdWxlMS5JbnRlcnZhbCgpXHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50RGlkTW91bnQoKXtcclxuICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbC5zdGFydCgxZTMsIChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHNlbGYuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbC5zdG9wKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudERpZFVwZGF0ZShhY3Rpdml0eSl7XHJcbiAgICAgICAgICAgIGlmKGFjdGl2aXR5LnRpbWVzdGFtcHMuZW5kID09PSB0aGlzLnByb3BzLnRpbWVzdGFtcHMuZW5kICYmIGFjdGl2aXR5LnRpbWVzdGFtcHMuc3RhcnQgPT09IHRoaXMucHJvcHMudGltZXN0YW1wcy5zdGFydClyZXR1cm5cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXRVcGRhdGVkVGltZSgpe1xyXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHRoaXMucHJvcHMudGltZXN0YW1wc1xyXG4gICAgICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKSAvIDFlMztcclxuICAgICAgICAgICAgaWYobnVsbCAhPSB0aW1lc3RhbXBzLmVuZCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREaWZmKG5vdywgY2hlY2tVbml4KHRpbWVzdGFtcHMuZW5kKSAvIDFlMylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihudWxsICE9IHRpbWVzdGFtcHMuc3RhcnQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlmZihjaGVja1VuaXgodGltZXN0YW1wcy5zdGFydCkgLyAxZTMsIG5vdylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaG91cnM6IDAsXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzOiAwLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kczogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXJUaW1lKG51bWJlciwgcmVtb3ZlWmVybyl7XHJcbiAgICAgICAgICAgIGlmKHJlbW92ZVplcm8gPT09IHVuZGVmaW5lZClyZW1vdmVaZXJvID0gZmFsc2VcclxuICAgICAgICAgICAgaWYocmVtb3ZlWmVybyAmJiBudW1iZXIgPD0gMClyZXR1cm4gLTFcclxuICAgICAgICAgICAgaWYobnVtYmVyIDwgMTApcmV0dXJuIFwiMFwiK251bWJlclxyXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXREaWZmKHRpbWVzdGFtcCwgbm93KXtcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gTWF0aC5tYXgobm93IC0gdGltZXN0YW1wLCAwKVxyXG4gICAgICAgICAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3IoaG91cnMpICUgNjBcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gNjApICUgNjBcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiBNYXRoLmZsb29yKGhvdXJzIC8gMzYwMCkgJSAyNCxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXMsXHJcbiAgICAgICAgICAgICAgICBzZWNvbmRzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSB0aGlzLnByb3BzXHJcbiAgICAgICAgICAgIGxldCB0aW1lc3RhbXBzID0gcHJvcHMudGltZXN0YW1wc1xyXG5cclxuICAgICAgICAgICAgbGV0IHVzZWRQcm9wcyA9IGZ1bmN0aW9uKHByb3BzLCBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJvcHMpIHJldHVybiB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHt9XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBrZXlzW2ldXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW1zLmluZGV4T2Yoa2V5KSA+PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wc1trZXldID0gcHJvcHNba2V5XVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wc1xyXG4gICAgICAgICAgICB9KHByb3BzLCBbXCJ0aW1lc3RhbXBzXCJdKVxyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZVxyXG4gICAgICAgICAgICBsZXQgaG91cnMgPSBzdGF0ZS5ob3Vyc1xyXG4gICAgICAgICAgICBsZXQgbWludXRlcyA9IHN0YXRlLm1pbnV0ZXNcclxuICAgICAgICAgICAgbGV0IHNlY29uZHMgPSBzdGF0ZS5zZWNvbmRzXHJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgaG91cnM6IHRoaXMucmVuZGVyVGltZShob3VycywgITApLFxyXG4gICAgICAgICAgICAgICAgbWludXRlczogdGhpcy5yZW5kZXJUaW1lKG1pbnV0ZXMpLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kczogdGhpcy5yZW5kZXJUaW1lKHNlY29uZHMpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmKHRpbWVzdGFtcHMuZW5kICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdXNlZFByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfRU5ELmZvcm1hdChkYXRhKVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGltZXN0YW1wcy5zdGFydCAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHVzZWRQcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX1NUQVJULmZvcm1hdChkYXRhKVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVGltZVJlbmRlclxyXG59O1xyXG5cclxuZnVuY3Rpb24gY2hlY2tVbml4KGUpIHtcclxuICAgIHJldHVybiAoXCJcIiArIGUpLmxlbmd0aCA8IDEzID8gMWUzICogZSA6IGVcclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVG9vbHMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IHRvb2xzTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9vbHNDb250YWluZXIpWzBdXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRhaW5lciAmJiBlLmNsb3NlQnV0dG9uICYmIGUuY2xvc2VCdXR0b25Cb2xkKVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ0b29scy1jb250YWluZXIgXCIrdG9vbHNNb2R1bGUudG9vbHNDb250YWluZXJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ0b29scyBcIit0b29sc01vZHVsZS50b29sc30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY29udGFpbmVyTW9kdWxlLmNvbnRhaW5lcn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYnRuLWNsb3NlIFwiK2NvbnRhaW5lck1vZHVsZS5jbG9zZUJ1dHRvbiwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZXNjLXRleHQgXCIrY29udGFpbmVyTW9kdWxlLmtleWJpbmR9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVTQ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jbG9zZUJ1dHRvbiAmJiBlLmtleWJpbmRCb2xkKVswXS5jbG9zZUJ1dHRvbi5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmIChjbG9zZUJ1dHRvbikgY2xvc2VCdXR0b24uY2xpY2soKTtcclxuICAgIH1cclxufSIsIi8qKlxyXG4gKiBUb29sdGlwIHRoYXQgYXV0b21hdGljYWxseSBzaG93IGFuZCBoaWRlIHRoZW1zZWx2ZXMgb24gbW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBldmVudHMuXHJcbiAqIFdpbGwgYWxzbyByZW1vdmUgdGhlbXNlbHZlcyBpZiB0aGUgbm9kZSB0byB3YXRjaCBpcyByZW1vdmVkIGZyb20gRE9NIHRocm91Z2hcclxuICogYSBNdXRhdGlvbk9ic2VydmVyLlxyXG4gKlxyXG4gKiBOb3RlIHRoaXMgaXMgbm90IHVzaW5nIERpc2NvcmQncyBpbnRlcm5hbHMgYnV0IG5vcm1hbCBET00gbWFuaXB1bGF0aW9uIGFuZCBlbXVsYXRlc1xyXG4gKiBEaXNjb3JkJ3Mgb3duIHRvb2x0aXBzIGFzIGNsb3NlbHkgYXMgcG9zc2libGUuXHJcbiAqXHJcbiAqIEBtb2R1bGUgRW11bGF0ZWRUb29sdGlwXHJcbiAqIEB2ZXJzaW9uIDAuMC4xXHJcbiAqL1xyXG5cclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuLy88ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljIGRpc2FibGVkUG9pbnRlckV2ZW50cy0xcHRnVEJcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMjM3cHg7IGJvdHRvbTogNTFweDtcIj5cclxuLy9cdDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyB0b29sdGlwVG9wLVhERFN4eCB0b29sdGlwQmxhY2stUFBHNDd6IHRvb2x0aXBEaXNhYmxlUG9pbnRlckV2ZW50cy0zZWFCR05cIiBzdHlsZT1cIm9wYWNpdHk6IDE7IHRyYW5zZm9ybTogbm9uZTtcIj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlyS1wiPjwvZGl2PlxyXG4vL1x0XHQ8ZGl2IGNsYXNzPVwidG9vbHRpcENvbnRlbnQtYnFWTFdLXCI+VXNlciBTZXR0aW5nczwvZGl2PlxyXG4vL1x0PC9kaXY+XHJcbi8vPC9kaXY+XHJcblxyXG4vLzxkaXYgY2xhc3M9XCJsYXllci12OUh5WWNcIiBzdHlsZT1cInRvcDogODYwcHg7IGxlZnQ6IDYzMi41cHg7XCI+XHJcbi8vXHQ8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgdG9vbHRpcEJsYWNrLVBQRzQ3eiB0b29sdGlwVG9wLVhERFN4eFwiPlxyXG4vL1x0XHQ8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLXCI+PC9kaXY+XHJcbi8vXHRcdENoYW5nZWxvZ1xyXG4vL1x0PC9kaXY+XHJcbi8vPC9kaXY+XHJcbmxldCBUb29sdGlwQ2xhc3Nlc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwQ2xhc3Nlcygpe1xyXG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xyXG5cdHJldHVybiBUb29sdGlwQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwidG9vbHRpcFwiLCBcInRvb2x0aXBCbGFja1wiKTtcclxufVxyXG5sZXQgVG9vbHRpcExheWVyc1xyXG5mdW5jdGlvbiBnZXRUb29sdGlwTGF5ZXJzKCl7XHJcblx0aWYoVG9vbHRpcExheWVycylyZXR1cm4gVG9vbHRpcExheWVyc1xyXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xyXG59XHJcblxyXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICBjb25zdCB1cHBlckNhc2UgPSBzaWRlT3JDb2xvclswXS50b1VwcGVyQ2FzZSgpICsgc2lkZU9yQ29sb3Iuc2xpY2UoMSk7XHJcbiAgICBjb25zdCB0b29sdGlwQ2xhc3MgPSBnZXRUb29sdGlwQ2xhc3NlcygpW2B0b29sdGlwJHt1cHBlckNhc2V9YF07XHJcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBjbGFzc0V4aXN0cyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XHJcbiAgICByZXR1cm4gZ2V0Q2xhc3Moc2lkZU9yQ29sb3IpID8gdHJ1ZSA6IGZhbHNlO1xyXG59O1xyXG5cclxuY29uc3QgdG9QeCA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xyXG59O1xyXG5cclxuLyogPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZYyBkYS1sYXllclwiIHN0eWxlPVwibGVmdDogMjM0LjVweDsgYm90dG9tOiA1MXB4O1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIGRhLXRvb2x0aXAgdG9vbHRpcFRvcC1YRERTeHggdG9vbHRpcEJsYWNrLVBQRzQ3elwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcksgZGEtdG9vbHRpcFBvaW50ZXJcIj48L2Rpdj5cclxuICAgICAgICBVc2VyIFNldHRpbmdzXHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+ICovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbXVsYXRlZFRvb2x0aXAge1xyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICogQGNvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8alF1ZXJ5KX0gbm9kZSAtIERPTSBub2RlIHRvIG1vbml0b3IgYW5kIHNob3cgdGhlIHRvb2x0aXAgb25cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9YmxhY2tdIC0gY29ycmVsYXRlcyB0byB0aGUgZGlzY29yZCBzdHlsaW5nL2NvbG9ycyAoYmxhY2ssIGJyYW5kLCBncmVlbiwgZ3JleSwgcmVkLCB5ZWxsb3cpXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5wcmV2ZW50RmxpcD1mYWxzZV0gLSBwcmV2ZW50cyBtb3ZpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIG9wcG9zaXRlIHNpZGUgaWYgaXQgaXMgdG9vIGJpZyBvciBnb2VzIG9mZnNjcmVlblxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaXNhYmxlZD1mYWxzZV0gLSB3aGV0aGVyIHRoZSB0b29sdGlwIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHNob3dpbmcgb24gaG92ZXJcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihub2RlLCB0ZXh0LCBvcHRpb25zID0ge30pIHtcclxuXHRcdGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHByZXZlbnRGbGlwID0gZmFsc2UsIGRpc2FibGVkID0gZmFsc2V9ID0gb3B0aW9ucztcclxuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgICAgICB0aGlzLmxhYmVsID0gdGV4dDtcclxuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTtcclxuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB0aGlzLnByZXZlbnRGbGlwID0gcHJldmVudEZsaXA7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG5cclxuICAgICAgICBpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc2lkZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFNpZGUgJHt0aGlzLnNpZGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0aWYgKCFjbGFzc0V4aXN0cyh0aGlzLnN0eWxlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU3R5bGUgJHt0aGlzLnN0eWxlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwTGF5ZXJzKCkubGF5ZXIgKyBcIiBcIiArIGdldFRvb2x0aXBMYXllcnMoKS5kaXNhYmxlZFBvaW50ZXJFdmVudHM7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cclxuXHRcdHRoaXMubGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcENvbnRlbnRcclxuXHJcblx0XHRjb25zdCBwb2ludGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRwb2ludGVyRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBQb2ludGVyO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHBvaW50ZXJFbGVtZW50KTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuYXBwZW5kKHRoaXMubGFiZWxFbGVtZW50KTtcclxuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcblxyXG5cdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuXHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKHRoaXMubm9kZSkgPiAtMTtcclxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xyXG5cdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb250YWluZXIgd2hlcmUgdGhlIHRvb2x0aXAgd2lsbCBiZSBhcHBlbmRlZC4gKi9cclxuICAgIGdldCBjb250YWluZXIoKSB7IHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLnBvcG91dHMpWzBdLnBvcG91dHMuc3BsaXQoXCIgXCIpWzBdK1wiIH4gLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyQ29udGFpbmVyKVswXS5sYXllckNvbnRhaW5lci5zcGxpdChcIiBcIilbMF0pOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIGFib3ZlIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0Fib3ZlKCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPj0gMDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBiZWxvdyB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dCZWxvdygpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0ICsgdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA8PSBVdGlscy5zY3JlZW5IZWlnaHQ7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gdG8gdGhlIGxlZnQgb2YgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93TGVmdCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gdG8gdGhlIHJpZ2h0IG9mIHRoZSBlbGVtZW50ICovXHJcblx0Z2V0IGNhblNob3dSaWdodCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIDw9IFV0aWxzLnNjcmVlbldpZHRoOyB9XHJcblxyXG4gICAgLyoqIEhpZGVzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWxlYXZlLiAqL1xyXG5cdGhpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xyXG5cdH1cclxuXHJcbiAgICAvKiogU2hvd3MgdGhlIHRvb2x0aXAuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIG9uIG1vdXNlZW50ZXIuIFdpbGwgYXR0ZW1wdCB0byBmbGlwIGlmIHBvc2l0aW9uIHdhcyB3cm9uZy4gKi9cclxuXHRzaG93KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMubGFiZWw7XHJcblx0XHR0aGlzLmNvbnRhaW5lci5hcHBlbmQodGhpcy5lbGVtZW50KTtcclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwidG9wXCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0Fib3ZlIHx8ICghdGhpcy5jYW5TaG93QWJvdmUgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93QmVsb3coKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwiYm90dG9tXCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0JlbG93IHx8ICghdGhpcy5jYW5TaG93QmVsb3cgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93QWJvdmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwibGVmdFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dMZWZ0IHx8ICghdGhpcy5jYW5TaG93TGVmdCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93TGVmdCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd1JpZ2h0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInJpZ2h0XCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd1JpZ2h0IHx8ICghdGhpcy5jYW5TaG93UmlnaHQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd1JpZ2h0KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93TGVmdCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBhYm92ZSB0aGUgbm9kZS4gKi9cclxuXHRzaG93QWJvdmUoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJ0b3BcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgLSAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYmVsb3cgdGhlIG5vZGUuICovXHJcblx0c2hvd0JlbG93KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwiYm90dG9tXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0ICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLiAqL1xyXG5cdHNob3dMZWZ0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwibGVmdFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLSAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJWZXJ0aWNhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSByaWdodCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93UmlnaHQoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJyaWdodFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJWZXJ0aWNhbGx5KCk7XHJcblx0fVxyXG5cclxuXHRjZW50ZXJIb3Jpem9udGFsbHkoKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKHRoaXMubm9kZS5vZmZzZXRXaWR0aCAvIDIpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeChub2RlY2VudGVyIC0gKHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAvIDIpKSk7XHJcblx0fVxyXG5cclxuXHRjZW50ZXJWZXJ0aWNhbGx5KCkge1xyXG5cdFx0Y29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAodGhpcy5ub2RlLm9mZnNldEhlaWdodCAvIDIpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMikpKTtcclxuXHR9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi90b29sdGlwXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgdGV4dCA9IFwiXCJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLm5vZGUgPSBCRFYyLnJlYWN0RG9tLmZpbmRET01Ob2RlKHRoaXMpO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy50b29sdGlwO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfWFN2ZyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3ZnXCIsXHJcbiAgICAgICAgICAgIHt4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAxMiAxMlwiLCBzdHlsZToge3dpZHRoOiBcIjE4cHhcIiwgaGVpZ2h0OiBcIjE4cHhcIn19LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImdcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmFja2dyb3VuZFwiLCBmaWxsOiBcIm5vbmVcIiwgZmlsbFJ1bGU6IFwiZXZlbm9kZFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTAgMGgxMnYxMkgwXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2NsYXNzTmFtZTogXCJmaWxsXCIsIGZpbGw6IFwiI2RjZGRkZVwiLCBkOiBcIk05LjUgMy4yMDVMOC43OTUgMi41IDYgNS4yOTUgMy4yMDUgMi41bC0uNzA1LjcwNUw1LjI5NSA2IDIuNSA4Ljc5NWwuNzA1LjcwNUw2IDYuNzA1IDguNzk1IDkuNWwuNzA1LS43MDVMNi43MDUgNlwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG9cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlY3Ryb25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXZlbnRzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1rZGlycFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb2R1bGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlcXVlc3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmltcmFmXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInlhdXpsXCIpOyJdLCJzb3VyY2VSb290IjoiIn0=